tx · 7PcvzfQ9UnNNZNHjvmxiZshdndexZF2Vt1CERk4o8Vq8 3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS: -0.01400000 Waves 2020.10.30 16:34 [1243429] smart account 3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS > SELF 0.00000000 Waves
{ "type": 13, "id": "7PcvzfQ9UnNNZNHjvmxiZshdndexZF2Vt1CERk4o8Vq8", "fee": 1400000, "feeAssetId": null, "timestamp": 1604064929080, "version": 1, "sender": "3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS", "senderPublicKey": "Hxyif8HnnHh34SZ7PZewDcNUgrZfHNJsQvLNCcPbCW27", "proofs": [ "5mRQktYDaGUokHBYqGNnZkTdmyG46FwzYTbidFTsmWF97JjTPL6zRopgjs9yUMvktbV4M5BLdY9nDxEz2MWjN7cu" ], "script": "base64:AAIEAAAAAAAAADwIAhIKCggICAEIAQEICBIRCg8ICAEIAQgBAQEBAQEBAQESAwoBCBIDCgEIEgQKAggBEgQKAggIEgMKAQgAAABaAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAgAAAAlqc29uQXJyYXkAAAALc3BsaXRTeW1ib2wJAAS1AAAAAgUAAAAJanNvbkFycmF5BQAAAAtzcGxpdFN5bWJvbAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkCAAAAAAEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5BwAAAAAMa2V5QXNzZXRDb2RlAAAAAAAAAAABAAAAAAprZXlBc3NldElkAAAAAAAAAAACAAAAAA5rZXlBc3NldFN0YXR1cwAAAAAAAAAAAwAAAAAVa2V5QXNzZXRQcmljZURlY2ltYWxzAAAAAAAAAAAEAAAAABNrZXlBc3NldEJha2luZ0Fzc2V0AAAAAAAAAAAFAAAAABtrZXlPdmVyY29sbGF0ZXJhbFBlcmNlbnRhZ2UAAAAAAAAAAAYAAAAACmtleU1pblBvb2wAAAAAAAAAAAcAAAAAFWtleVByaWNlT3JhY2xlQWRkcmVzcwAAAAAAAAAACAAAAAAQa2V5TWluQnV5UGF5bWVudAAAAAAAAAAACQAAAAARa2V5TWluU2VsbFBheW1lbnQAAAAAAAAAAAoAAAAAEmtleUJ1eUxvY2tJbnRlcnZhbAAAAAAAAAAACwAAAAATa2V5U2VsbExvY2tJbnRlcnZhbAAAAAAAAAAADAAAAAAJa2V5QnV5RmVlAAAAAAAAAAANAAAAAAprZXlTZWxsRmVlAAAAAAAAAAAOAAAAABhrZXlQb29sUmVkZW1wdGlvblRpbWVvdXQAAAAAAAAAAA8AAAAAIWtleVdlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAAAAAAAAAAAEAAAAAAOYWRtaW5QdWJsaWNLZXkCAAAALEcxRWJ1NUFNSGFUSkZFYlpOa1pRY0pGVVE5S2ZpWVV3dXB5TEc4NTdEY0ZyAAAAABpuZXV0cmlub0NvbnRyYWN0QWRkcmVzc0tleQIAAAArJXMlc19fY29tbW9uQ29uZmlnX19uZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAAAAZbmV1dHJpbm9TdGFraW5nQWRkcmVzc0tleQIAAAAqJXMlc19fY29tbW9uQ29uZmlnX19uZXV0cmlub1N0YWtpbmdBZGRyZXNzAAAAABttaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnRLZXkCAAAALCVzJXNfX2NvbW1vbkNvbmZpZ19fbWluaW11bVBvb2xGdW5kaW5nQW1vdW50AAAAABBpc0luaXRpYWxpemVkS2V5AgAAAB8lcyVzX19jb21tb25Db25maWdfX2luaXRpYWxpemVkAAAAABRjdXJyZW50QXNzZXRJbmRleEtleQIAAAAvJXMlc19fY29tbW9uQ29uZmlnX19wcmVkZWZpbmVkQXNzZXRzQWN0aXZlSW5kZXgAAAAAFGFzc2V0c0FkZHJlc3NMaXN0S2V5AgAAACglcyVzX19jb21tb25Db25maWdfX3ByZWRlZmluZWRBc3NldHNMaXN0AAAAAA5kZWJ0VG9rZW5JZEtleQIAAAAfJXMlc19fY29tbW9uQ29uZmlnX19kZWJ0QXNzZXRJZAAAAAAZZGVidFRva2VuRXRhbG9uQmFsYW5jZUtleQIAAAAqJXMlc19fY29tbW9uQ29uZmlnX19kZWJ0QXNzZXRFdGFsb25CYWxhbmNlAAAAABVkZWZvU3Rha2luZ0FkZHJlc3NLZXkCAAAAJiVzJXNfX2NvbW1vbkNvbmZpZ19fZGVmb1N0YWtpbmdBZGRyZXNzAAAAABpkZWZvU3Rha2luZ1BhY2VtYWtlclB1YktleQIAAAArJXMlc19fY29tbW9uQ29uZmlnX19kZWZvU3Rha2luZ1BhY2VtYWtlclB1YgAAAAASbmV1dHJpbm9Bc3NldElkS2V5AgAAABFuZXV0cmlub19hc3NldF9pZAAAAAAObnNidEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAADmRlZm9Bc3NldElkS2V5AgAAAA8lc19fZGVmb0Fzc2V0SWQAAAAAFXNldEFzc2V0U2NyaXB0VHhJZEtleQIAAAATJXNfX2Fzc2V0U2NyaXB0VHhJZAEAAAARZ2V0QXNzZXRDb25maWdLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAIX19jb25maWcBAAAAEGdldEFzc2V0UHJpY2VLZXkAAAABAAAACWFzc2V0Q29kZQkAASwAAAACAgAAABIlcyVzX19hc3NldFByaWNlX18FAAAACWFzc2V0Q29kZQEAAAAVZ2V0QXNzZXRJbml0SGVpZ2h0S2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAxhc3NldEFkZHJlc3MCAAAADF9faW5pdEhlaWdodAEAAAAZZ2V0QXNzZXRBY3RpdmF0ZUhlaWdodEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAABBfX2FjdGl2YXRlSGVpZ2h0AQAAAB1nZXRBc3NldEN1cnJyZW50UG9vbEFtb3VudEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAA1fX2N1cnJlbnRQb29sAQAAABhnZXRBc3NldE1heFBvb2xBbW91bnRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAJX19tYXhQb29sAQAAAA9nZXRBc3NldE1ldGFLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAGX19tZXRhAQAAABVnZXRBc3NldFBvb2xNYWtlcnNLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAMX19wb29sTWFrZXJzAQAAABhnZXRBc3NldEFkZHJlc3NCeUNvZGVLZXkAAAABAAAACWFzc2V0Q29kZQkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAACWFzc2V0Q29kZQIAAAAUX19hZGRyZXNzQnlBc3NldENvZGUBAAAAG2dldEFzc2V0QWRkcmVzc0J5QXNzZXRJZEtleQAAAAEAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAAB2Fzc2V0SWQCAAAAEl9fYWRkcmVzc0J5QXNzZXRJZAEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQJXMlcyVzJXNfX3Bvb2xfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAJfXwUAAAAQcG9vbE1ha2VyQWRkcmVzcwIAAAAIX19hbW91bnQBAAAAJWdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAECVzJXMlcyVzX19wb29sX18FAAAADGFzc2V0QWRkcmVzcwIAAAACX18FAAAAEHBvb2xNYWtlckFkZHJlc3MCAAAAC19fbWF4QW1vdW50AQAAABtnZXRQb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAECVzJXMlcyVzX19wb29sX18FAAAADGFzc2V0QWRkcmVzcwIAAAACX18FAAAAEHBvb2xNYWtlckFkZHJlc3MCAAAADl9fbG9ja2VkQW1vdW50AQAAABtnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAECVzJXMlcyVzX19wb29sX18FAAAADGFzc2V0QWRkcmVzcwIAAAACX18FAAAAEHBvb2xNYWtlckFkZHJlc3MCAAAADl9fdW5sb2NrSGVpZ2h0AQAAABNnZXRBc3NldENvbmZpZ0FycmF5AAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAEdGhpcwkBAAAAEWdldEFzc2V0Q29uZmlnS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAOTm8gREVGTyBBc3NldCAFAAAADGFzc2V0QWRkcmVzcwIAAAAOY29uZmlnIHByZXNlbnQCAAAAAl9fAAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAabmV1dHJpbm9Db250cmFjdEFkZHJlc3NLZXkCAAAAH05vIG5ldXRyaW5vIGNvbnRyYWN0IHNwZWNpZmllZC4AAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASbmV1dHJpbm9Bc3NldElkS2V5AgAAABdObyBVU0ROIGFzc2V0IGlkIGZvdW5kLgAAAAALbnNidEFzc2V0SWQJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAADm5zYnRBc3NldElkS2V5AgAAABZObyBOU0JUIGFzc2V0IGlkIGZvdW5kAAAAABJtaW5pbXVtUG9vbEZ1bmRpbmcJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABttaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnRLZXkCAAAALU1pbmltdW0gcG9vbCBmdW5kaW5nIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLgAAAAALYXNzZXRTdGF0dXMJAAUVAAAAAwIAAAAIUFJPUE9TRUQCAAAABVJFQURZAgAAAAZJU1NVRUQAAAAAGHByZWRlZmluZWRBc3NldENvbnRyYWN0cwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAFGFzc2V0c0FkZHJlc3NMaXN0S2V5AgAAAC1ObyBwb29sIG9mIHByZWRlcGxveWVkIGFzc2V0IGNvbnRyYWN0cyBmb3VuZC4AAAAAFHByZWRlZmluZWRBc3NldHNMaXN0CQEAAAAWY29udmVydEpzb25BcnJheVRvTGlzdAAAAAIFAAAAGHByZWRlZmluZWRBc3NldENvbnRyYWN0cwIAAAABLAAAAAARY3VycmVudEFzc2V0SW5kZXgJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAUY3VycmVudEFzc2V0SW5kZXhLZXkAAAAAAAAAAAAAAAAACWRlYnRUb2tlbgkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAOZGVidFRva2VuSWRLZXkCAAAAE05vIGRlYnQgdG9rZW4gZm91bmQAAAAADW11bHRpcGxpY2F0b3IAAAAAAAAPQkAAAAAAFmRlYnRUb2tlblJlaXNzdWVBbW91bnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAZZGVidFRva2VuRXRhbG9uQmFsYW5jZUtleQAAAAAAAAAAAAEAAAAVZ2V0QXNzZXRBZGRyZXNzQnlDb2RlAAAAAQAAAAthc3NldFN5bWJvbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAYZ2V0QXNzZXRBZGRyZXNzQnlDb2RlS2V5AAAAAQUAAAALYXNzZXRTeW1ib2wCAAAAAAEAAAAMZ2V0QXNzZXRDb2RlAAAAAQAAAAthc3NldENvbmZpZwkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAMa2V5QXNzZXRDb2RlAQAAAApnZXRBc3NldElEAAAAAQAAAAthc3NldENvbmZpZwkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAKa2V5QXNzZXRJZAEAAAAOZ2V0QXNzZXRTdGF0dXMAAAABAAAAC2Fzc2V0Q29uZmlnCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAAA5rZXlBc3NldFN0YXR1cwEAAAAVZ2V0QXNzZXRQcmljZURlY2ltYWxzAAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABVrZXlBc3NldFByaWNlRGVjaW1hbHMBAAAAFWdldEFzc2V0QmFraW5nQXNzZXRJZAAAAAEAAAALYXNzZXRDb25maWcJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAE2tleUFzc2V0QmFraW5nQXNzZXQBAAAAHWdldEFzc2V0T3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABtrZXlPdmVyY29sbGF0ZXJhbFBlcmNlbnRhZ2UBAAAAHWdldEFzc2V0TWluUmVxdWlyZWRQb29sQW1vdW50AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAAAprZXlNaW5Qb29sAQAAABpnZXRBc3NldFByaWNlT3JhY2xlQWRkcmVzcwAAAAEAAAALYXNzZXRDb25maWcJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAFWtleVByaWNlT3JhY2xlQWRkcmVzcwEAAAAYZ2V0TWluQnV5UGF5bWVudFBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABBrZXlNaW5CdXlQYXltZW50AQAAABlnZXRNaW5TZWxsUGF5bWVudFBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABFrZXlNaW5TZWxsUGF5bWVudAEAAAAaZ2V0QnV5TG9ja0ludGVydmFsUGVyQXNzZXQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAEmtleUJ1eUxvY2tJbnRlcnZhbAEAAAAbZ2V0U2VsbExvY2tJbnRlcnZhbFBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABNrZXlTZWxsTG9ja0ludGVydmFsAQAAABFnZXRCdXlGZWVQZXJBc3NldAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAJa2V5QnV5RmVlAQAAABJnZXRTZWxsRmVlUGVyQXNzZXQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAACmtleVNlbGxGZWUBAAAAGmdldFJlZGVtcHRpb25UaW1lb3V0QmxvY2tzAAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABhrZXlQb29sUmVkZW1wdGlvblRpbWVvdXQBAAAAIWdldFdlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAha2V5V2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AQAAABJnZXRBc3NldFBvb2xNYWtlcnMAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAVZ2V0QXNzZXRQb29sTWFrZXJzS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzAgAAAAABAAAAEmdldEFzc2V0SW5pdEhlaWdodAAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABVnZXRBc3NldEluaXRIZWlnaHRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MAAAAAAAAAAAABAAAAFmdldEFzc2V0QWN0aXZhdGVIZWlnaHQAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAZZ2V0QXNzZXRBY3RpdmF0ZUhlaWdodEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwAAAAAAAAAAAAEAAAAZZ2V0QXNzZXRDdXJyZW50UG9vbEFtb3VudAAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAB1nZXRBc3NldEN1cnJyZW50UG9vbEFtb3VudEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwAAAAAAAAAAAAEAAAAVZ2V0QXNzZXRNYXhQb29sQW1vdW50AAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAGGdldEFzc2V0TWF4UG9vbEFtb3VudEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwAAAAAAAAAAAAEAAAAMZ2V0QXNzZXRNZXRhAAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAD2dldEFzc2V0TWV0YUtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwIAAAAAAQAAAB9nZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAQcG9vbE1ha2VyQWRkcmVzcwAAAAAAAAAAAAEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbk1heEFtb3VudAAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAJWdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnRLZXkAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAAEHBvb2xNYWtlckFkZHJlc3MAAAAAAAAAAAABAAAAGGdldFBvb2xNYWtlckxvY2tlZEFtb3VudAAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAG2dldFBvb2xNYWtlckxvY2tlZEFtb3VudEtleQAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAQcG9vbE1ha2VyQWRkcmVzcwAAAAAAAAAAAAEAAAAYZ2V0UG9vbE1ha2VyVW5sb2NrSGVpZ2h0AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAbZ2V0UG9vbE1ha2VyVW5sb2NrSGVpZ2h0S2V5AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAABBwb29sTWFrZXJBZGRyZXNzAAAAAAAAAAAAAQAAAA1nZXRBc3NldFByaWNlAAAAAgAAABJwcmljZU9yYWNsZUFkZHJlc3MAAAAJYXNzZXRDb2RlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAScHJpY2VPcmFjbGVBZGRyZXNzCQEAAAAQZ2V0QXNzZXRQcmljZUtleQAAAAEFAAAACWFzc2V0Q29kZQIAAAAUTm8gQXNzZXQgcHJpY2UgZm91bmQBAAAAH2NvbXBvc2VBc3NldENvbmZpZ3VyYXRpb25TdHJpbmcAAAAQAAAACWFzc2V0Q29kZQAAAAdhc3NldElkAAAAC2Fzc2V0U3RhdHVzAAAADXByaWNlRGVjaW1hbHMAAAAOYmFja2luZ0Fzc2V0SWQAAAAVb3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAB21pblBvb2wAAAAScHJpY2VPcmFjbGVBZGRyZXNzAAAADW1pbkJ1eVBheW1lbnQAAAAObWluU2VsbFBheW1lbnQAAAAPYnV5TG9ja0ludGVydmFsAAAAEHNlbGxMb2NrSW50ZXJ2YWwAAAAGYnV5RmVlAAAAB3NlbGxGZWUAAAAVcG9vbFJlZGVtcHRpb25UaW1lb3V0AAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAkABLkAAAACCQAETAAAAAICAAAAHiVzJXMlcyVkJXMlZCVkJXMlZCVkJWQlZCVkJWQlZAkABEwAAAACBQAAAAlhc3NldENvZGUJAARMAAAAAgUAAAAHYXNzZXRJZAkABEwAAAACBQAAAAthc3NldFN0YXR1cwkABEwAAAACCQABpAAAAAEFAAAADXByaWNlRGVjaW1hbHMJAARMAAAAAgUAAAAOYmFja2luZ0Fzc2V0SWQJAARMAAAAAgkAAaQAAAABBQAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQJAARMAAAAAgkAAaQAAAABBQAAAAdtaW5Qb29sCQAETAAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwkABEwAAAACCQABpAAAAAEFAAAADW1pbkJ1eVBheW1lbnQJAARMAAAAAgkAAaQAAAABBQAAAA5taW5TZWxsUGF5bWVudAkABEwAAAACCQABpAAAAAEFAAAAD2J1eUxvY2tJbnRlcnZhbAkABEwAAAACCQABpAAAAAEFAAAAEHNlbGxMb2NrSW50ZXJ2YWwJAARMAAAAAgkAAaQAAAABBQAAAAZidXlGZWUJAARMAAAAAgkAAaQAAAABBQAAAAdzZWxsRmVlCQAETAAAAAIJAAGkAAAAAQUAAAAVcG9vbFJlZGVtcHRpb25UaW1lb3V0CQAETAAAAAIJAAGkAAAAAQUAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50BQAAAANuaWwCAAAAAl9fAQAAABR1cGRhdGVBc3NldENmZ1N0YXR1cwAAAAIAAAAJbmV3U3RhdHVzAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAABWFDb2RlCQEAAAAMZ2V0QXNzZXRDb2RlAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAADYUlECQEAAAAKZ2V0QXNzZXRJRAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAADmFQcmljZURlY2ltYWxzCQEAAAAVZ2V0QXNzZXRQcmljZURlY2ltYWxzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAOYUJha2luZ0Fzc2V0SWQJAQAAABVnZXRBc3NldEJha2luZ0Fzc2V0SWQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABZhT3ZlckNvbGxhdGVyYWxQZXJjZW50CQEAAAAdZ2V0QXNzZXRPdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABBhTWluUmVxdWlyZWRQb29sCQEAAAAdZ2V0QXNzZXRNaW5SZXF1aXJlZFBvb2xBbW91bnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABNhUHJpY2VPcmFjbGVBZGRyZXNzCQEAAAAaZ2V0QXNzZXRQcmljZU9yYWNsZUFkZHJlc3MAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAA5hTWluQnV5UGF5bWVudAkBAAAAGGdldE1pbkJ1eVBheW1lbnRQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAD2FNaW5TZWxsUGF5bWVudAkBAAAAGWdldE1pblNlbGxQYXltZW50UGVyQXNzZXQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABBhQnV5TG9ja0ludGVydmFsCQEAAAAaZ2V0QnV5TG9ja0ludGVydmFsUGVyQXNzZXQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABFhU2VsbExvY2tJbnRlcnZhbAkBAAAAG2dldFNlbGxMb2NrSW50ZXJ2YWxQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAB2FCdXlGZWUJAQAAABFnZXRCdXlGZWVQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAACGFTZWxsRmVlCQEAAAASZ2V0U2VsbEZlZVBlckFzc2V0AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAYYVJlZGVtcHRpb25UaW1lb3V0QmxvY2tzCQEAAAAaZ2V0UmVkZW1wdGlvblRpbWVvdXRCbG9ja3MAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQJAQAAACFnZXRXZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0CQEAAAAfY29tcG9zZUFzc2V0Q29uZmlndXJhdGlvblN0cmluZwAAABAFAAAABWFDb2RlBQAAAANhSUQFAAAACW5ld1N0YXR1cwUAAAAOYVByaWNlRGVjaW1hbHMFAAAADmFCYWtpbmdBc3NldElkBQAAABZhT3ZlckNvbGxhdGVyYWxQZXJjZW50BQAAABBhTWluUmVxdWlyZWRQb29sBQAAABNhUHJpY2VPcmFjbGVBZGRyZXNzBQAAAA5hTWluQnV5UGF5bWVudAUAAAAPYU1pblNlbGxQYXltZW50BQAAABBhQnV5TG9ja0ludGVydmFsBQAAABFhU2VsbExvY2tJbnRlcnZhbAUAAAAHYUJ1eUZlZQUAAAAIYVNlbGxGZWUFAAAAGGFSZWRlbXB0aW9uVGltZW91dEJsb2NrcwUAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AAAABwAAAAFpAQAAAARpbml0AAAACAAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAABZuZXV0cmlub1N0YWtpbmdBZGRyZXNzAAAAGG1pbmltdW5Qb29sRnVuZGluZ0Ftb3VudAAAABNwcmVkZWZpbmVkQXNzZXRMaXN0AAAAEWN1cnJlbnRBc3NldEluZGV4AAAAEmRlYnRFdGhhbG9uQmFsYW5jZQAAABJkZWZvU3Rha2luZ0FkZHJlc3MAAAAXZGVmb1N0YWtpbmdQYWNlbWFrZXJQdWIDCQEAAAACIT0AAAACCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAAACAAAAAQIAAAAqT25seSBBZG1pbiBjYW4gcGVyZm9ybSBjb250cmFjdCBvcGVyYXRpb24uAwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQYJAAACAAAAAQIAAAAhQ29udHJhY3Qgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuBAAAAAlpc3N1ZURlYnQJAARCAAAABQIAAAAJREVGT19ERUJUAgAAABBERUZPIERlYnQgVG9rZW4uAAAAAAAAAAABAAAAAAAAAAAGBgQAAAALZGVidFRva2VuSWQJAAQ4AAAAAQUAAAAJaXNzdWVEZWJ0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAGm5ldXRyaW5vQ29udHJhY3RBZGRyZXNzS2V5BQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABluZXV0cmlub1N0YWtpbmdBZGRyZXNzS2V5BQAAABZuZXV0cmlub1N0YWtpbmdBZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABttaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnRLZXkFAAAAGG1pbmltdW5Qb29sRnVuZGluZ0Ftb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABRhc3NldHNBZGRyZXNzTGlzdEtleQUAAAATcHJlZGVmaW5lZEFzc2V0TGlzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUY3VycmVudEFzc2V0SW5kZXhLZXkFAAAAEWN1cnJlbnRBc3NldEluZGV4CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABlkZWJ0VG9rZW5FdGFsb25CYWxhbmNlS2V5BQAAABJkZWJ0RXRoYWxvbkJhbGFuY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAOZGVidFRva2VuSWRLZXkJAAJYAAAAAQUAAAALZGVidFRva2VuSWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAVZGVmb1N0YWtpbmdBZGRyZXNzS2V5BQAAABJkZWZvU3Rha2luZ0FkZHJlc3MJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAaZGVmb1N0YWtpbmdQYWNlbWFrZXJQdWJLZXkFAAAAF2RlZm9TdGFraW5nUGFjZW1ha2VyUHViCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAABBpc0luaXRpYWxpemVkS2V5BgkABEwAAAACBQAAAAlpc3N1ZURlYnQJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAtkZWJ0VG9rZW5JZAAAAAAAAAAAAQUAAAADbmlsAAAAAWkBAAAADHByb3Bvc2VBc3NldAAAAA8AAAAJYXNzZXRDb2RlAAAABG1ldGEAAAAHbWluUG9vbAAAABJwcmljZU9yYWNsZUFkZHJlc3MAAAAVb3ZlckNvbGxhdGVyYWxQZXJjZW50AAAADmJhY2tpbmdBc3NldElkAAAADXByaWNlRGVjaW1hbHMAAAANbWluQnV5UGF5bWVudAAAAA5taW5TZWxsUGF5bWVudAAAAA9idXlMb2NrSW50ZXJ2YWwAAAAQc2VsbExvY2tJbnRlcnZhbAAAAAZidXlGZWUAAAAHc2VsbEZlZQAAABVwb29sUmVkZW1wdGlvblRpbWVvdXQAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AwkBAAAAAiE9AAAAAgkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAADmFkbWluUHVibGljS2V5CQAAAgAAAAECAAAAKk9ubHkgQWRtaW4gY2FuIHBlcmZvcm0gY29udHJhY3Qgb3BlcmF0aW9uLgMJAAAAAAAAAgkBAAAADGdldEJvb2xCeUtleQAAAAEFAAAAEGlzSW5pdGlhbGl6ZWRLZXkHCQAAAgAAAAECAAAAGkNvbnRyYWN0IGlzIG5vdCB5ZXQgcmVhZHkuAwkBAAAAAiE9AAAAAgkAAlkAAAABBQAAAA5iYWNraW5nQXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQAAAgAAAAECAAAAI0Jha2luZyBhc3NldCBpZCBjb3VsZCBiZSBVU0ROIG9ubHkuAwkBAAAAAiE9AAAAAgkBAAAAFWdldEFzc2V0QWRkcmVzc0J5Q29kZQAAAAEFAAAACWFzc2V0Q29kZQIAAAAACQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABdBc3NldCB3aXRoIHBhc3NlZCBjb2RlIAUAAAAJYXNzZXRDb2RlAgAAABsgaGFzIGFscmVhZHkgYmVlbiBwcm9wb3NlZC4DCQAAZgAAAAIFAAAAEm1pbmltdW1Qb29sRnVuZGluZwUAAAAHbWluUG9vbAkAAAIAAAABCQABLAAAAAICAAAAM01pbmltdW0gcG9vbCBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWxzIHRvIAkAAaQAAAABBQAAABJtaW5pbXVtUG9vbEZ1bmRpbmcDAwMDAwMDAwkAAGYAAAACAAAAAAAAAAAABQAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQGCQAAZgAAAAIAAAAAAAAAAAAFAAAADXByaWNlRGVjaW1hbHMGCQAAZgAAAAIAAAAAAAAAAAAFAAAADW1pbkJ1eVBheW1lbnQGCQAAZgAAAAIAAAAAAAAAAAAFAAAADm1pblNlbGxQYXltZW50BgkAAGYAAAACAAAAAAAAAAAABQAAAA9idXlMb2NrSW50ZXJ2YWwGCQAAZgAAAAIAAAAAAAAAAAAFAAAAEHNlbGxMb2NrSW50ZXJ2YWwGCQAAZgAAAAIAAAAAAAAAAAAFAAAABmJ1eUZlZQYJAABmAAAAAgAAAAAAAAAAAAUAAAAHc2VsbEZlZQkAAAIAAAABAgAAAChPbmUgb2YgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzIGlzIGludmFsaWQuBAAAABdwcmljZU9yYWNsZUFkZHJlc3NWYWxpZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAABJwcmljZU9yYWNsZUFkZHJlc3MCAAAAKVBhc3NlZCBQcmljZSBPcmFjbGUgQWRkcmVzcyBpcyBub3QgdmFsaWQuBAAAAAxhc3NldEFkZHJlc3MJAAGRAAAAAgUAAAAUcHJlZGVmaW5lZEFzc2V0c0xpc3QFAAAAEWN1cnJlbnRBc3NldEluZGV4BAAAAAtkZWZvQXNzZXRJZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAAxhc3NldEFkZHJlc3MCAAAAAAUAAAAOZGVmb0Fzc2V0SWRLZXkCAAAAF05vIGRlZm8gYXNzZXQgSUQgZm91bmQuCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFnZXRBc3NldENvbmZpZ0tleQAAAAEFAAAADGFzc2V0QWRkcmVzcwkBAAAAH2NvbXBvc2VBc3NldENvbmZpZ3VyYXRpb25TdHJpbmcAAAAQBQAAAAlhc3NldENvZGUFAAAAC2RlZm9Bc3NldElkCAUAAAALYXNzZXRTdGF0dXMAAAACXzEFAAAADXByaWNlRGVjaW1hbHMFAAAADmJhY2tpbmdBc3NldElkBQAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQFAAAAB21pblBvb2wFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwUAAAANbWluQnV5UGF5bWVudAUAAAAObWluU2VsbFBheW1lbnQFAAAAD2J1eUxvY2tJbnRlcnZhbAUAAAAQc2VsbExvY2tJbnRlcnZhbAUAAAAGYnV5RmVlBQAAAAdzZWxsRmVlBQAAABVwb29sUmVkZW1wdGlvblRpbWVvdXQFAAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAYZ2V0QXNzZXRBZGRyZXNzQnlDb2RlS2V5AAAAAQUAAAAJYXNzZXRDb2RlBQAAAAxhc3NldEFkZHJlc3MJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldEFzc2V0TWV0YUtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAEbWV0YQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFWdldEFzc2V0SW5pdEhlaWdodEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRjdXJyZW50QXNzZXRJbmRleEtleQkAAGQAAAACBQAAABFjdXJyZW50QXNzZXRJbmRleAAAAAAAAAAAAQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAbZ2V0QXNzZXRBZGRyZXNzQnlBc3NldElkS2V5AAAAAQUAAAALZGVmb0Fzc2V0SWQFAAAADGFzc2V0QWRkcmVzcwUAAAADbmlsAAAAAWkBAAAAEWZ1bmRMaXF1aWRpdHlQb29sAAAAAQAAAAlhc3NldENvZGUEAAAADGFzc2V0QWRkcmVzcwkBAAAAFWdldEFzc2V0QWRkcmVzc0J5Q29kZQAAAAEFAAAACWFzc2V0Q29kZQQAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAkBAAAAE2dldEFzc2V0Q29uZmlnQXJyYXkAAAABBQAAAAxhc3NldEFkZHJlc3MEAAAAD2F0dGFjaGVkUGF5bWVudAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAMJAQAAAAIhPQAAAAIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5hZG1pblB1YmxpY0tleQkAAAIAAAABAgAAACpPbmx5IEFkbWluIGNhbiBwZXJmb3JtIGNvbnRyYWN0IG9wZXJhdGlvbi4DCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BwkAAAIAAAABAgAAABpDb250cmFjdCBpcyBub3QgeWV0IHJlYWR5LgMJAQAAAAIhPQAAAAIIBQAAAA9hdHRhY2hlZFBheW1lbnQAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQAAAgAAAAECAAAALkxpcXVpZGl0eSBwb29sIGNvdWxkIGJlIGZ1bmRlZCB3aXRoIFVTRE4gb25seS4DCQAAAAAAAAIIBQAAAA9hdHRhY2hlZFBheW1lbnQAAAAGYW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAIkluY29ycmVjdCBhdHRhY2hlZCBwYXltZW50IGFtb3VudC4DCQAAAAAAAAIFAAAADGFzc2V0QWRkcmVzcwIAAAAACQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAACVDYW5ub3QgZmluZCBsaXF1aWRpdHkgcG9vbCBmb3IgYXNzZXQgBQAAAAlhc3NldENvZGUCAAAAAS4EAAAAD2ZpbmFsUG9vbEFtb3VudAkAAGQAAAACCAUAAAAPYXR0YWNoZWRQYXltZW50AAAABmFtb3VudAkBAAAAGWdldEFzc2V0Q3VycmVudFBvb2xBbW91bnQAAAABBQAAAAxhc3NldEFkZHJlc3MEAAAADW1heFBvb2xBbW91bnQJAQAAABVnZXRBc3NldE1heFBvb2xBbW91bnQAAAABBQAAAAxhc3NldEFkZHJlc3MEAAAAEHBvb2xNYWtlckFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAABdjdXJyZW50UG9vbE1ha2VyQmFsYW5jZQkBAAAAH2dldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnQAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAE21heFBvb2xNYWtlckJhbGFuY2UJAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uTWF4QW1vdW50AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAABBwb29sTWFrZXJBZGRyZXNzBAAAABFjdXJyZW50UG9vbFN0YXR1cwkBAAAADmdldEFzc2V0U3RhdHVzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAPZmluYWxQb29sU3RhdHVzAwMJAABnAAAAAgUAAAAPZmluYWxQb29sQW1vdW50CQEAAAAdZ2V0QXNzZXRNaW5SZXF1aXJlZFBvb2xBbW91bnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0CQAAAAAAAAIFAAAAEWN1cnJlbnRQb29sU3RhdHVzCAUAAAALYXNzZXRTdGF0dXMAAAACXzEHCAUAAAALYXNzZXRTdGF0dXMAAAACXzIFAAAAEWN1cnJlbnRQb29sU3RhdHVzBAAAABFjdXJyZW50UG9vbE1ha2VycwkBAAAAEmdldEFzc2V0UG9vbE1ha2VycwAAAAEFAAAADGFzc2V0QWRkcmVzcwQAAAANbmV3UG9vbE1ha2VycwMJAAAAAAAAAgUAAAARY3VycmVudFBvb2xNYWtlcnMCAAAAAAUAAAAQcG9vbE1ha2VyQWRkcmVzcwMJAQAAAAhjb250YWlucwAAAAIFAAAAEWN1cnJlbnRQb29sTWFrZXJzBQAAABBwb29sTWFrZXJBZGRyZXNzBQAAABFjdXJyZW50UG9vbE1ha2VycwkAASwAAAACCQABLAAAAAIFAAAAEWN1cnJlbnRQb29sTWFrZXJzAgAAAAEsCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAATbmV3UG9vbE1ha2VyQmFsYW5jZQkAAGQAAAACBQAAABdjdXJyZW50UG9vbE1ha2VyQmFsYW5jZQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BAAAAAZyZXN1bHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5AAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAATbmV3UG9vbE1ha2VyQmFsYW5jZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAJWdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnRLZXkAAAACBQAAAAxhc3NldEFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAwkAAGYAAAACBQAAABNuZXdQb29sTWFrZXJCYWxhbmNlBQAAABNtYXhQb29sTWFrZXJCYWxhbmNlBQAAABNuZXdQb29sTWFrZXJCYWxhbmNlBQAAABNtYXhQb29sTWFrZXJCYWxhbmNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAdZ2V0QXNzZXRDdXJycmVudFBvb2xBbW91bnRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MFAAAAD2ZpbmFsUG9vbEFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAGGdldEFzc2V0TWF4UG9vbEFtb3VudEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwMJAABmAAAAAgUAAAAPZmluYWxQb29sQW1vdW50BQAAAA1tYXhQb29sQW1vdW50BQAAAA9maW5hbFBvb2xBbW91bnQFAAAADW1heFBvb2xBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFWdldEFzc2V0UG9vbE1ha2Vyc0tleQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAANbmV3UG9vbE1ha2VycwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0QXNzZXRDb25maWdLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MJAQAAABR1cGRhdGVBc3NldENmZ1N0YXR1cwAAAAIFAAAAD2ZpbmFsUG9vbFN0YXR1cwUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAUAAAADbmlsAwkAAAAAAAACBQAAABFjdXJyZW50UG9vbFN0YXR1cwgFAAAAC2Fzc2V0U3RhdHVzAAAAAl8zCQAETQAAAAIFAAAABnJlc3VsdAkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAMYXNzZXRBZGRyZXNzCAUAAAAPYXR0YWNoZWRQYXltZW50AAAABmFtb3VudAUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAAZyZXN1bHQAAAABaQEAAAANYWN0aXZhdGVBc3NldAAAAAEAAAAJYXNzZXRDb2RlBAAAAAxhc3NldEFkZHJlc3MJAQAAABVnZXRBc3NldEFkZHJlc3NCeUNvZGUAAAABBQAAAAlhc3NldENvZGUEAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAQAAABNnZXRBc3NldENvbmZpZ0FycmF5AAAAAQUAAAAMYXNzZXRBZGRyZXNzBAAAABZhc3NldEN1cnJlbnRQb29sQW1vdW50CQEAAAAZZ2V0QXNzZXRDdXJyZW50UG9vbEFtb3VudAAAAAEFAAAADGFzc2V0QWRkcmVzcwQAAAAOYUN1cnJlbnRTdGF0dXMJAQAAAA5nZXRBc3NldFN0YXR1cwAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QDCQEAAAACIT0AAAACCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAAACAAAAAQIAAAAqT25seSBBZG1pbiBjYW4gcGVyZm9ybSBjb250cmFjdCBvcGVyYXRpb24uAwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQcJAAACAAAAAQIAAAAaQ29udHJhY3QgaXMgbm90IHlldCByZWFkeS4DCQEAAAACIT0AAAACBQAAAA5hQ3VycmVudFN0YXR1cwgFAAAAC2Fzc2V0U3RhdHVzAAAAAl8yCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAADBBc3NldCBpcyBub3QgaW4gUkVBRFkgc3RhdHVzLiBDdXJyZW50IHN0YXR1cyBpcyAFAAAADmFDdXJyZW50U3RhdHVzAgAAAAEuAwkAAAAAAAACBQAAAAxhc3NldEFkZHJlc3MCAAAAAAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAASQ2Fubm90IGZpbmQgYXNzZXQgBQAAAAlhc3NldENvZGUCAAAAAS4DCQAAZgAAAAIFAAAAEm1pbmltdW1Qb29sRnVuZGluZwUAAAAWYXNzZXRDdXJyZW50UG9vbEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAALUNhbm5vdCBpc3N1ZSBhc3NldCBhcyBsaXF1aWRpdHkgcG9vbCBhbW91bnQgKAkAAaQAAAABBQAAABZhc3NldEN1cnJlbnRQb29sQW1vdW50AgAAABkpIGlzIGxlc3MgdGhhbiByZXF1aXJlZCAoCQABpAAAAAEFAAAAEm1pbmltdW1Qb29sRnVuZGluZwIAAAABKQQAAAAJaXNzdWVEZWJ0CQEAAAAHUmVpc3N1ZQAAAAMFAAAACWRlYnRUb2tlbgUAAAAWZGVidFRva2VuUmVpc3N1ZUFtb3VudAYJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABlnZXRBc3NldEFjdGl2YXRlSGVpZ2h0S2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldEFzc2V0Q29uZmlnS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzCQEAAAAUdXBkYXRlQXNzZXRDZmdTdGF0dXMAAAACCAUAAAALYXNzZXRTdGF0dXMAAAACXzMFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAARMAAAAAgUAAAAJaXNzdWVEZWJ0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAWYXNzZXRDdXJyZW50UG9vbEFtb3VudAUAAAAPbmV1dHJpbm9Bc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAWZGVidFRva2VuUmVpc3N1ZUFtb3VudAUAAAAJZGVidFRva2VuBQAAAANuaWwAAAABaQEAAAAOcmVkZWVtRnJvbVBvb2wAAAACAAAACWFzc2V0Q29kZQAAAAZhbW91bnQEAAAADGFzc2V0QWRkcmVzcwkBAAAAFWdldEFzc2V0QWRkcmVzc0J5Q29kZQAAAAEFAAAACWFzc2V0Q29kZQQAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAkBAAAAE2dldEFzc2V0Q29uZmlnQXJyYXkAAAABBQAAAAxhc3NldEFkZHJlc3MEAAAADWNhbGxlckFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAABl0b3RhbEFtb3VudEluUG9vbEJ5Q2FsbGVyCQEAAAAfZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudAAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAANY2FsbGVyQWRkcmVzcwQAAAAXbG9ja2VkQW1vdW50QnlQb29sTWFrZXIJAQAAABhnZXRQb29sTWFrZXJMb2NrZWRBbW91bnQAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAADWNhbGxlckFkZHJlc3MDCQEAAAACIT0AAAACCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAAACAAAAAQIAAAAqT25seSBBZG1pbiBjYW4gcGVyZm9ybSBjb250cmFjdCBvcGVyYXRpb24uAwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQcJAAACAAAAAQIAAAAaQ29udHJhY3QgaXMgbm90IHlldCByZWFkeS4DCQAAAAAAAAIFAAAADGFzc2V0QWRkcmVzcwIAAAAACQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABJDYW5ub3QgZmluZCBhc3NldCAFAAAACWFzc2V0Q29kZQIAAAABLgMDAwkAAGYAAAACAAAAAAAAAAAABQAAAAZhbW91bnQGCQAAAAAAAAIFAAAAGXRvdGFsQW1vdW50SW5Qb29sQnlDYWxsZXIAAAAAAAAAAAAGCQAAZgAAAAIFAAAABmFtb3VudAUAAAAZdG90YWxBbW91bnRJblBvb2xCeUNhbGxlcgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAiQ2Fubm90IGZpbmQgcG9vbCBtYWtlciBieSBhZGRyZXNzIAUAAAANY2FsbGVyQWRkcmVzcwIAAAAhIG9yIGFtb3VudCBwYXNzZWQgaXMgbm90IGNvcnJlY3QuAwkAAGYAAAACBQAAABdsb2NrZWRBbW91bnRCeVBvb2xNYWtlcgAAAAAAAAAAAAkAAAIAAAABAgAAAEZQb29sIG1ha2VyIGFscmVhZHkgaGFzIGluaXRpYXRlZCByZWRlbXB0aW9uIHRoYXQgaXMgbm90IHdpdGhkcmF3biB5ZXQuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAbZ2V0UG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAADWNhbGxlckFkZHJlc3MJAABkAAAAAgUAAAAGaGVpZ2h0CQEAAAAaZ2V0UmVkZW1wdGlvblRpbWVvdXRCbG9ja3MAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BQAAAANuaWwAAAABaQEAAAAbZ2V0TWF4QWxsb3dlZEFtb3VudFRvUmVkZWVtAAAAAgAAAAlhc3NldENvZGUAAAAJcG9vbE1ha2VyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAApe2FsbG93ZWRBbW91bnRUb1JlZGVlbTogMTAwMCwgYXNzZXRDb2RlOiAFAAAACWFzc2V0Q29kZQIAAAANLCBwb29sTWFrZXI6IAUAAAAJcG9vbE1ha2VyAgAAAAF9AAAAAWkBAAAACHdpdGhkcmF3AAAAAQAAAAlhc3NldENvZGUEAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAQAAABNnZXRBc3NldENvbmZpZ0FycmF5AAAAAQUAAAAJYXNzZXRDb2RlBAAAAAxhc3NldEFkZHJlc3MJAQAAABVnZXRBc3NldEFkZHJlc3NCeUNvZGUAAAABBQAAAAlhc3NldENvZGUEAAAAEnByaWNlT3JhY2xlQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAGmdldEFzc2V0UHJpY2VPcmFjbGVBZGRyZXNzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAANY2FsbGVyQWRkcmVzcwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAEnN5bnRoZXRpY0Fzc2V0SW5mbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEJAAJZAAAAAQUAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAICAAAAGENhbm5vdCBmaW5kIGFzc2V0IGJ5IGlkIAUAAAAMYXNzZXRBZGRyZXNzBAAAABp0b3RhbFVTRE5CYWxhbmNlT25Db250cmFjdAkAA/AAAAACBQAAAAR0aGlzBQAAAA9uZXV0cmlub0Fzc2V0SWQEAAAAHHRvdGFsQW1vdW50SW5Qb29sQnlQb29sTWFrZXIJAQAAAB9nZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAAA1jYWxsZXJBZGRyZXNzBAAAABdsb2NrZWRBbW91bnRCeVBvb2xNYWtlcgkBAAAAGGdldFBvb2xNYWtlckxvY2tlZEFtb3VudAAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAANY2FsbGVyQWRkcmVzcwQAAAARbWluV2l0aGRyYXdIZWlnaHQJAQAAABhnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHQAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAADWNhbGxlckFkZHJlc3MEAAAAE3Bvb2xNYWtldFByb3BvcnRpb24JAABpAAAAAgkBAAAAFWdldEFzc2V0TWF4UG9vbEFtb3VudAAAAAEFAAAADGFzc2V0QWRkcmVzcwkBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnQAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAADWNhbGxlckFkZHJlc3MDCQEAAAACIT0AAAACCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAAACAAAAAQIAAAAqT25seSBBZG1pbiBjYW4gcGVyZm9ybSBjb250cmFjdCBvcGVyYXRpb24uAwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQcJAAACAAAAAQIAAAAaQ29udHJhY3QgaXMgbm90IHlldCByZWFkeS4DCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BwkAAAIAAAABAgAAABpDb250cmFjdCBpcyBub3QgeWV0IHJlYWR5LgMJAAAAAAAAAgUAAAAMYXNzZXRBZGRyZXNzAgAAAAAJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAEkNhbm5vdCBmaW5kIGFzc2V0IAUAAAAJYXNzZXRDb2RlAgAAAAEuAwkAAAAAAAACBQAAABx0b3RhbEFtb3VudEluUG9vbEJ5UG9vbE1ha2VyAAAAAAAAAAAACQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAACJDYW5ub3QgZmluZCBwb29sIG1ha2VyIGJ5IGFkZHJlc3MgBQAAAA1jYWxsZXJBZGRyZXNzAgAAABUgb3Igbm8gbG9ja2VkIGFtb3VudC4DCQAAZgAAAAIFAAAABmhlaWdodAUAAAARbWluV2l0aGRyYXdIZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAADFBsZWFzZSB3YWl0IAkAAaQAAAABBQAAABFtaW5XaXRoZHJhd0hlaWdodAIAAAARIGJlZm9yZSB3aXRoZHJhdy4EAAAADWFzc2V0RW1pc3Npb24IBQAAABJzeW50aGV0aWNBc3NldEluZm8AAAAIcXVhbnRpdHkEAAAADGN1cnJlbnRQcmljZQkBAAAADWdldEFzc2V0UHJpY2UAAAACBQAAABJwcmljZU9yYWNsZUFkZHJlc3MFAAAACWFzc2V0Q29kZQQAAAAVcG9vbE1ha2VyTG9ja2VkQW1vdW50CQEAAAAYZ2V0UG9vbE1ha2VyTG9ja2VkQW1vdW50AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAAA1jYWxsZXJBZGRyZXNzBAAAABtwcmljZVdpdGhPdmVyY29sbGF0ZXJhbFJhdGUJAABoAAAAAgkBAAAAHWdldEFzc2V0T3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAUAAAAMY3VycmVudFByaWNlBAAAABl1c2RuTmVlZGVkVG9Db3ZlckVtaXNzaW9uCQAAaAAAAAIFAAAAG3ByaWNlV2l0aE92ZXJjb2xsYXRlcmFsUmF0ZQUAAAANYXNzZXRFbWlzc2lvbgMJAABmAAAAAgUAAAAadG90YWxVU0ROQmFsYW5jZU9uQ29udHJhY3QFAAAAGXVzZG5OZWVkZWRUb0NvdmVyRW1pc3Npb24EAAAAHGFtb3V0QXZhaWxhYmxlVG9FeGl0RnJvbVBvb2wJAABlAAAAAgUAAAAadG90YWxVU0ROQmFsYW5jZU9uQ29udHJhY3QFAAAAGXVzZG5OZWVkZWRUb0NvdmVyRW1pc3Npb24EAAAAEWFtb3VudEZvcldpdGhkcmF3CQAAaAAAAAIFAAAAE3Bvb2xNYWtldFByb3BvcnRpb24FAAAAHGFtb3V0QXZhaWxhYmxlVG9FeGl0RnJvbVBvb2wEAAAAEWZpbmFsTG9ja2VkQW1vdW50CQAAZQAAAAIJAQAAABhnZXRQb29sTWFrZXJMb2NrZWRBbW91bnQAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAADWNhbGxlckFkZHJlc3MFAAAAEWFtb3VudEZvcldpdGhkcmF3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAdZ2V0QXNzZXRDdXJycmVudFBvb2xBbW91bnRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MJAABlAAAAAgkBAAAAGWdldEFzc2V0Q3VycmVudFBvb2xBbW91bnQAAAABBQAAAAxhc3NldEFkZHJlc3MFAAAAEWFtb3VudEZvcldpdGhkcmF3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAANY2FsbGVyQWRkcmVzcwkAAGUAAAACCQEAAAAfZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudAAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAANY2FsbGVyQWRkcmVzcwUAAAARYW1vdW50Rm9yV2l0aGRyYXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtnZXRQb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAADWNhbGxlckFkZHJlc3MFAAAAEWZpbmFsTG9ja2VkQW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADWNhbGxlckFkZHJlc3MFAAAAEWFtb3VudEZvcldpdGhkcmF3BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAKnz0EE=", "chainId": 84, "height": 1243429, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7cDWMnhqNGsoKXC9DQYXSzaNEjmdgZXrEAZhYjqKEnTv Next: CP3B6voJ9BFaP5Jh1n1vU3yEQotepaAo51KovJSysVj Diff:
Old | New | Differences | |
---|---|---|---|
226 | 226 | func aV (P,Y,aj,aW,aX,aY,aZ,aU,ba,bb,bc,bd,be,bf,bg,bh) = makeString(["%s%s%s%d%s%d%d%s%d%d%d%d%d%d%d", P, Y, aj, toString(aW), aX, toString(aY), toString(aZ), aU, toString(ba), toString(bb), toString(bc), toString(bd), toString(be), toString(bf), toString(bg), toString(bh)], "__") | |
227 | 227 | ||
228 | 228 | ||
229 | - | @Callable(bi) | |
230 | - | func init (bj,bk,bl,bm,am,bn,bo,bp) = if ((toBase58String(bi.callerPublicKey) != x)) | |
229 | + | func bi (bj,bk) = { | |
230 | + | let bl = as(bk) | |
231 | + | let bm = au(bk) | |
232 | + | let bn = aw(bk) | |
233 | + | let bo = ax(bk) | |
234 | + | let bp = ay(bk) | |
235 | + | let bq = az(bk) | |
236 | + | let br = aA(bk) | |
237 | + | let bs = aB(bk) | |
238 | + | let bt = aC(bk) | |
239 | + | let bu = aD(bk) | |
240 | + | let bv = aE(bk) | |
241 | + | let bw = aF(bk) | |
242 | + | let bx = aG(bk) | |
243 | + | let by = aH(bk) | |
244 | + | let bh = aI(bk) | |
245 | + | aV(bl, bm, bj, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bh) | |
246 | + | } | |
247 | + | ||
248 | + | ||
249 | + | @Callable(bz) | |
250 | + | func init (bA,bB,bC,bD,am,bE,bF,bG) = if ((toBase58String(bz.callerPublicKey) != x)) | |
231 | 251 | then throw("Only Admin can perform contract operation.") | |
232 | 252 | else if ((g(B) == true)) | |
233 | 253 | then throw("Contract was already initialized.") | |
234 | 254 | else { | |
235 | - | let | |
236 | - | let | |
237 | - | [StringEntry(y, | |
255 | + | let bH = Issue("DEFO_DEBT", "DEFO Debt Token.", 1, 6, true) | |
256 | + | let bI = calculateAssetId(bH) | |
257 | + | [StringEntry(y, bA), StringEntry(z, bB), IntegerEntry(A, bC), StringEntry(D, bD), IntegerEntry(C, am), IntegerEntry(F, bE), StringEntry(E, toBase58String(bI)), StringEntry(G, bF), StringEntry(H, bG), BooleanEntry(B, true), bH, Burn(bI, 1)] | |
238 | 258 | } | |
239 | 259 | ||
240 | 260 | ||
241 | 261 | ||
242 | - | @Callable( | |
243 | - | func proposeAsset (P, | |
262 | + | @Callable(bz) | |
263 | + | func proposeAsset (P,bJ,aZ,aU,aY,aX,aW,ba,bb,bc,bd,be,bf,bg,bh) = if ((toBase58String(bz.callerPublicKey) != x)) | |
244 | 264 | then throw("Only Admin can perform contract operation.") | |
245 | 265 | else if ((g(B) == false)) | |
246 | 266 | then throw("Contract is not yet ready.") | |
267 | 287 | else (0 > bf)) | |
268 | 288 | then throw("One of the passed parameters is invalid.") | |
269 | 289 | else { | |
270 | - | let | |
290 | + | let bK = valueOrErrorMessage(addressFromStringValue(aU), "Passed Price Oracle Address is not valid.") | |
271 | 291 | let N = al[am] | |
272 | - | let | |
273 | - | [StringEntry(M(N), aV(P, | |
292 | + | let bL = valueOrErrorMessage(getString(valueOrErrorMessage(addressFromString(N), ""), K), "No defo asset ID found.") | |
293 | + | [StringEntry(M(N), aV(P, bL, aj._1, aW, aX, aY, aZ, aU, ba, bb, bc, bd, be, bf, bg, bh)), StringEntry(W(P), N), StringEntry(U(N), bJ), IntegerEntry(Q(N), height), IntegerEntry(C, (am + 1)), StringEntry(X(bL), N)] | |
274 | 294 | } | |
275 | 295 | ||
276 | 296 | ||
277 | 297 | ||
278 | - | @Callable( | |
298 | + | @Callable(bz) | |
279 | 299 | func fundLiquidityPool (P) = { | |
280 | 300 | let N = aq(P) | |
281 | - | let | |
282 | - | let | |
283 | - | if ((toBase58String( | |
301 | + | let bk = ae(N) | |
302 | + | let bM = value(bz.payments[0]) | |
303 | + | if ((toBase58String(bz.callerPublicKey) != x)) | |
284 | 304 | then throw("Only Admin can perform contract operation.") | |
285 | 305 | else if ((g(B) == false)) | |
286 | 306 | then throw("Contract is not yet ready.") | |
287 | - | else if (( | |
307 | + | else if ((bM.assetId != ag)) | |
288 | 308 | then throw("Liquidity pool could be funded with USDN only.") | |
289 | - | else if (( | |
309 | + | else if ((bM.amount == 0)) | |
290 | 310 | then throw("Incorrect attached payment amount.") | |
291 | 311 | else if ((N == "")) | |
292 | 312 | then throw((("Cannot find liquidity pool for asset " + P) + ".")) | |
293 | 313 | else { | |
294 | - | let | |
295 | - | let | |
296 | - | let aa = toString( | |
297 | - | let | |
298 | - | let | |
299 | - | let | |
300 | - | let | |
301 | - | then ( | |
314 | + | let bN = (bM.amount + aM(N)) | |
315 | + | let bO = aN(N) | |
316 | + | let aa = toString(bz.caller) | |
317 | + | let bP = aP(N, aa) | |
318 | + | let bQ = aQ(N, aa) | |
319 | + | let bR = av(bk) | |
320 | + | let bS = if (if ((bN >= az(bk))) | |
321 | + | then (bR == aj._1) | |
302 | 322 | else false) | |
303 | 323 | then aj._2 | |
304 | - | else | |
305 | - | let | |
306 | - | let | |
324 | + | else bR | |
325 | + | let bT = aJ(N) | |
326 | + | let bU = if ((bT == "")) | |
307 | 327 | then aa | |
308 | - | else if (contains(bD, aa)) | |
309 | - | then bD | |
310 | - | else ((bD + ",") + toString(bi.caller)) | |
311 | - | let bF = as(bv) | |
312 | - | let bG = au(bv) | |
313 | - | let bH = aw(bv) | |
314 | - | let bI = ax(bv) | |
315 | - | let bJ = ay(bv) | |
316 | - | let bK = az(bv) | |
317 | - | let bL = aA(bv) | |
318 | - | let bM = aB(bv) | |
319 | - | let bN = aC(bv) | |
320 | - | let bO = aD(bv) | |
321 | - | let bP = aE(bv) | |
322 | - | let bQ = aF(bv) | |
323 | - | let bR = aG(bv) | |
324 | - | let bS = aH(bv) | |
325 | - | let bh = aI(bv) | |
326 | - | let bT = (bz + bi.payments[0].amount) | |
327 | - | let bU = [IntegerEntry(Z(N, toString(bi.caller)), bT), IntegerEntry(ab(N, toString(bi.caller)), if ((bT > bA)) | |
328 | - | then bT | |
329 | - | else bA), IntegerEntry(S(N), bx), IntegerEntry(T(N), if ((bx > by)) | |
330 | - | then bx | |
331 | - | else by), DeleteEntry(M(N)), StringEntry(V(N), bE), StringEntry(M(N), aV(bF, bG, bC, bH, bI, bJ, bK, bL, bM, bN, bO, bP, bQ, bR, bS, bh))] | |
332 | - | if ((bB == aj._3)) | |
333 | - | then (bU :+ ScriptTransfer(addressFromStringValue(N), bw.amount, ag)) | |
334 | - | else bU | |
328 | + | else if (contains(bT, aa)) | |
329 | + | then bT | |
330 | + | else ((bT + ",") + toString(bz.caller)) | |
331 | + | let bV = (bP + bz.payments[0].amount) | |
332 | + | let bW = [IntegerEntry(Z(N, toString(bz.caller)), bV), IntegerEntry(ab(N, toString(bz.caller)), if ((bV > bQ)) | |
333 | + | then bV | |
334 | + | else bQ), IntegerEntry(S(N), bN), IntegerEntry(T(N), if ((bN > bO)) | |
335 | + | then bN | |
336 | + | else bO), StringEntry(V(N), bU), StringEntry(M(N), bi(bS, bk))] | |
337 | + | if ((bR == aj._3)) | |
338 | + | then (bW :+ ScriptTransfer(addressFromStringValue(N), bM.amount, ag)) | |
339 | + | else bW | |
335 | 340 | } | |
336 | 341 | } | |
337 | 342 | ||
338 | 343 | ||
339 | 344 | ||
340 | - | @Callable( | |
345 | + | @Callable(bz) | |
341 | 346 | func activateAsset (P) = { | |
342 | 347 | let N = aq(P) | |
343 | - | let bv = ae(N) | |
344 | - | let bV = aM(N) | |
345 | - | let bF = as(bv) | |
346 | - | let bW = av(bv) | |
347 | - | let bG = au(bv) | |
348 | - | let bH = aw(bv) | |
349 | - | let bI = ax(bv) | |
350 | - | let bJ = ay(bv) | |
351 | - | let bK = az(bv) | |
352 | - | let bL = aA(bv) | |
353 | - | let bM = aB(bv) | |
354 | - | let bN = aC(bv) | |
355 | - | let bO = aD(bv) | |
356 | - | let bP = aE(bv) | |
357 | - | let bQ = aF(bv) | |
358 | - | let bR = aG(bv) | |
359 | - | let bS = aH(bv) | |
360 | - | let bh = aI(bv) | |
361 | - | if ((toBase58String(bi.callerPublicKey) != x)) | |
348 | + | let bk = ae(N) | |
349 | + | let bX = aM(N) | |
350 | + | let bY = av(bk) | |
351 | + | if ((toBase58String(bz.callerPublicKey) != x)) | |
362 | 352 | then throw("Only Admin can perform contract operation.") | |
363 | 353 | else if ((g(B) == false)) | |
364 | 354 | then throw("Contract is not yet ready.") | |
365 | - | else if (( | |
366 | - | then throw((("Asset is not in READY status. Current status is " + | |
355 | + | else if ((bY != aj._2)) | |
356 | + | then throw((("Asset is not in READY status. Current status is " + bY) + ".")) | |
367 | 357 | else if ((N == "")) | |
368 | 358 | then throw((("Cannot find asset " + P) + ".")) | |
369 | - | else if ((ai > | |
370 | - | then throw((((("Cannot issue asset as liquidity pool amount (" + toString( | |
359 | + | else if ((ai > bX)) | |
360 | + | then throw((((("Cannot issue asset as liquidity pool amount (" + toString(bX)) + ") is less than required (") + toString(ai)) + ")")) | |
371 | 361 | else { | |
372 | - | let | |
373 | - | [IntegerEntry(R(N), height), | |
362 | + | let bH = Reissue(an, ap, true) | |
363 | + | [IntegerEntry(R(N), height), StringEntry(M(N), bi(aj._3, bk)), bH, ScriptTransfer(addressFromStringValue(N), bX, ag), ScriptTransfer(addressFromStringValue(N), ap, an)] | |
374 | 364 | } | |
375 | 365 | } | |
376 | 366 | ||
377 | 367 | ||
378 | 368 | ||
379 | - | @Callable( | |
380 | - | func redeemFromPool (P, | |
369 | + | @Callable(bz) | |
370 | + | func redeemFromPool (P,bZ) = { | |
381 | 371 | let N = aq(P) | |
382 | - | let | |
383 | - | let | |
384 | - | let | |
385 | - | let | |
386 | - | if ((toBase58String( | |
372 | + | let bk = ae(N) | |
373 | + | let ca = toString(bz.caller) | |
374 | + | let cb = aP(N, ca) | |
375 | + | let cc = aR(N, ca) | |
376 | + | if ((toBase58String(bz.callerPublicKey) != x)) | |
387 | 377 | then throw("Only Admin can perform contract operation.") | |
388 | 378 | else if ((g(B) == false)) | |
389 | 379 | then throw("Contract is not yet ready.") | |
390 | 380 | else if ((N == "")) | |
391 | 381 | then throw((("Cannot find asset " + P) + ".")) | |
392 | - | else if (if (if ((0 > | |
382 | + | else if (if (if ((0 > bZ)) | |
393 | 383 | then true | |
394 | - | else ( | |
384 | + | else (cb == 0)) | |
395 | 385 | then true | |
396 | - | else ( | |
397 | - | then throw((("Cannot find pool maker by address " + | |
398 | - | else if (( | |
386 | + | else (bZ > cb)) | |
387 | + | then throw((("Cannot find pool maker by address " + ca) + " or amount passed is not correct.")) | |
388 | + | else if ((cc > 0)) | |
399 | 389 | then throw("Pool maker already has initiated redemption that is not withdrawn yet.") | |
400 | - | else [IntegerEntry(ac(N, | |
390 | + | else [IntegerEntry(ac(N, ca), bZ), IntegerEntry(ad(N, ca), (height + aH(bk)))] | |
401 | 391 | } | |
402 | 392 | ||
403 | 393 | ||
404 | 394 | ||
405 | - | @Callable(bi) | |
395 | + | @Callable(bz) | |
396 | + | func getMaxAllowedAmountToRedeem (P,cd) = throw((((("{allowedAmountToRedeem: 1000, assetCode: " + P) + ", poolMaker: ") + cd) + "}")) | |
397 | + | ||
398 | + | ||
399 | + | ||
400 | + | @Callable(bz) | |
406 | 401 | func withdraw (P) = { | |
407 | - | let | |
402 | + | let bk = ae(P) | |
408 | 403 | let N = aq(P) | |
409 | - | let aU = addressFromStringValue(aA( | |
410 | - | let | |
411 | - | let | |
412 | - | let | |
413 | - | let | |
414 | - | let | |
415 | - | let | |
416 | - | let | |
417 | - | if ((toBase58String( | |
404 | + | let aU = addressFromStringValue(aA(bk)) | |
405 | + | let ca = toString(bz.caller) | |
406 | + | let ce = valueOrErrorMessage(assetInfo(fromBase58String(N)), ("Cannot find asset by id " + N)) | |
407 | + | let cf = assetBalance(this, ag) | |
408 | + | let cg = aP(N, ca) | |
409 | + | let cc = aR(N, ca) | |
410 | + | let ch = aS(N, ca) | |
411 | + | let ci = (aN(N) / aQ(N, ca)) | |
412 | + | if ((toBase58String(bz.callerPublicKey) != x)) | |
418 | 413 | then throw("Only Admin can perform contract operation.") | |
419 | 414 | else if ((g(B) == false)) | |
420 | 415 | then throw("Contract is not yet ready.") | |
422 | 417 | then throw("Contract is not yet ready.") | |
423 | 418 | else if ((N == "")) | |
424 | 419 | then throw((("Cannot find asset " + P) + ".")) | |
425 | - | else if (( | |
426 | - | then throw((("Cannot find pool maker by address " + | |
427 | - | else if ((height > | |
428 | - | then throw((("Please wait " + toString( | |
420 | + | else if ((cg == 0)) | |
421 | + | then throw((("Cannot find pool maker by address " + ca) + " or no locked amount.")) | |
422 | + | else if ((height > ch)) | |
423 | + | then throw((("Please wait " + toString(ch)) + " before withdraw.")) | |
429 | 424 | else { | |
430 | - | let | |
431 | - | let | |
432 | - | let | |
433 | - | let | |
434 | - | let | |
435 | - | if (( | |
425 | + | let cj = ce.quantity | |
426 | + | let ck = aT(aU, P) | |
427 | + | let cl = aR(N, ca) | |
428 | + | let cm = (ay(bk) * ck) | |
429 | + | let cn = (cm * cj) | |
430 | + | if ((cf > cn)) | |
436 | 431 | then { | |
437 | - | let | |
438 | - | let | |
439 | - | let | |
440 | - | [IntegerEntry(S(N), (aM(N) - | |
432 | + | let co = (cf - cn) | |
433 | + | let cp = (ci * co) | |
434 | + | let cq = (aR(N, ca) - cp) | |
435 | + | [IntegerEntry(S(N), (aM(N) - cp)), IntegerEntry(Z(N, ca), (aP(N, ca) - cp)), IntegerEntry(ac(N, ca), cq), ScriptTransfer(addressFromStringValue(ca), cp, ag)] | |
441 | 436 | } | |
442 | 437 | else nil | |
443 | 438 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func a (b,c) = split(b, c) | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func d (e,f) = valueOrElse(getString(e, f), "") | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func g (f) = valueOrElse(getBoolean(this, f), false) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | let h = 1 | |
14 | 14 | ||
15 | 15 | let i = 2 | |
16 | 16 | ||
17 | 17 | let j = 3 | |
18 | 18 | ||
19 | 19 | let k = 4 | |
20 | 20 | ||
21 | 21 | let l = 5 | |
22 | 22 | ||
23 | 23 | let m = 6 | |
24 | 24 | ||
25 | 25 | let n = 7 | |
26 | 26 | ||
27 | 27 | let o = 8 | |
28 | 28 | ||
29 | 29 | let p = 9 | |
30 | 30 | ||
31 | 31 | let q = 10 | |
32 | 32 | ||
33 | 33 | let r = 11 | |
34 | 34 | ||
35 | 35 | let s = 12 | |
36 | 36 | ||
37 | 37 | let t = 13 | |
38 | 38 | ||
39 | 39 | let u = 14 | |
40 | 40 | ||
41 | 41 | let v = 15 | |
42 | 42 | ||
43 | 43 | let w = 16 | |
44 | 44 | ||
45 | 45 | let x = "G1Ebu5AMHaTJFEbZNkZQcJFUQ9KfiYUwupyLG857DcFr" | |
46 | 46 | ||
47 | 47 | let y = "%s%s__commonConfig__neutrinoContractAddress" | |
48 | 48 | ||
49 | 49 | let z = "%s%s__commonConfig__neutrinoStakingAddress" | |
50 | 50 | ||
51 | 51 | let A = "%s%s__commonConfig__minimumPoolFundingAmount" | |
52 | 52 | ||
53 | 53 | let B = "%s%s__commonConfig__initialized" | |
54 | 54 | ||
55 | 55 | let C = "%s%s__commonConfig__predefinedAssetsActiveIndex" | |
56 | 56 | ||
57 | 57 | let D = "%s%s__commonConfig__predefinedAssetsList" | |
58 | 58 | ||
59 | 59 | let E = "%s%s__commonConfig__debtAssetId" | |
60 | 60 | ||
61 | 61 | let F = "%s%s__commonConfig__debtAssetEtalonBalance" | |
62 | 62 | ||
63 | 63 | let G = "%s%s__commonConfig__defoStakingAddress" | |
64 | 64 | ||
65 | 65 | let H = "%s%s__commonConfig__defoStakingPacemakerPub" | |
66 | 66 | ||
67 | 67 | let I = "neutrino_asset_id" | |
68 | 68 | ||
69 | 69 | let J = "bond_asset_id" | |
70 | 70 | ||
71 | 71 | let K = "%s__defoAssetId" | |
72 | 72 | ||
73 | 73 | let L = "%s__assetScriptTxId" | |
74 | 74 | ||
75 | 75 | func M (N) = (("%s%s%s__defoAsset__" + N) + "__config") | |
76 | 76 | ||
77 | 77 | ||
78 | 78 | func O (P) = ("%s%s__assetPrice__" + P) | |
79 | 79 | ||
80 | 80 | ||
81 | 81 | func Q (N) = (("%s%s%s__defoAsset__" + N) + "__initHeight") | |
82 | 82 | ||
83 | 83 | ||
84 | 84 | func R (N) = (("%s%s%s__defoAsset__" + N) + "__activateHeight") | |
85 | 85 | ||
86 | 86 | ||
87 | 87 | func S (N) = (("%s%s%s__defoAsset__" + N) + "__currentPool") | |
88 | 88 | ||
89 | 89 | ||
90 | 90 | func T (N) = (("%s%s%s__defoAsset__" + N) + "__maxPool") | |
91 | 91 | ||
92 | 92 | ||
93 | 93 | func U (N) = (("%s%s%s__defoAsset__" + N) + "__meta") | |
94 | 94 | ||
95 | 95 | ||
96 | 96 | func V (N) = (("%s%s%s__defoAsset__" + N) + "__poolMakers") | |
97 | 97 | ||
98 | 98 | ||
99 | 99 | func W (P) = (("%s%s%s__defoAsset__" + P) + "__addressByAssetCode") | |
100 | 100 | ||
101 | 101 | ||
102 | 102 | func X (Y) = (("%s%s%s__defoAsset__" + Y) + "__addressByAssetId") | |
103 | 103 | ||
104 | 104 | ||
105 | 105 | func Z (N,aa) = (((("%s%s%s%s__pool__" + N) + "__") + aa) + "__amount") | |
106 | 106 | ||
107 | 107 | ||
108 | 108 | func ab (N,aa) = (((("%s%s%s%s__pool__" + N) + "__") + aa) + "__maxAmount") | |
109 | 109 | ||
110 | 110 | ||
111 | 111 | func ac (N,aa) = (((("%s%s%s%s__pool__" + N) + "__") + aa) + "__lockedAmount") | |
112 | 112 | ||
113 | 113 | ||
114 | 114 | func ad (N,aa) = (((("%s%s%s%s__pool__" + N) + "__") + aa) + "__unlockHeight") | |
115 | 115 | ||
116 | 116 | ||
117 | 117 | func ae (N) = a(valueOrErrorMessage(d(this, M(N)), (("No DEFO Asset " + N) + "config present")), "__") | |
118 | 118 | ||
119 | 119 | ||
120 | 120 | let af = addressFromStringValue(valueOrErrorMessage(getString(this, y), "No neutrino contract specified.")) | |
121 | 121 | ||
122 | 122 | let ag = fromBase58String(valueOrErrorMessage(getString(af, I), "No USDN asset id found.")) | |
123 | 123 | ||
124 | 124 | let ah = fromBase58String(valueOrErrorMessage(getString(af, J), "No NSBT asset id found")) | |
125 | 125 | ||
126 | 126 | let ai = valueOrErrorMessage(getInteger(this, A), "Minimum pool funding amount is not specified.") | |
127 | 127 | ||
128 | 128 | let aj = $Tuple3("PROPOSED", "READY", "ISSUED") | |
129 | 129 | ||
130 | 130 | let ak = valueOrErrorMessage(getString(this, D), "No pool of predeployed asset contracts found.") | |
131 | 131 | ||
132 | 132 | let al = a(ak, ",") | |
133 | 133 | ||
134 | 134 | let am = valueOrElse(getInteger(this, C), 0) | |
135 | 135 | ||
136 | 136 | let an = fromBase58String(valueOrErrorMessage(getString(this, E), "No debt token found")) | |
137 | 137 | ||
138 | 138 | let ao = 1000000 | |
139 | 139 | ||
140 | 140 | let ap = valueOrElse(getInteger(this, F), 0) | |
141 | 141 | ||
142 | 142 | func aq (ar) = valueOrElse(getString(this, W(ar)), "") | |
143 | 143 | ||
144 | 144 | ||
145 | 145 | func as (at) = at[h] | |
146 | 146 | ||
147 | 147 | ||
148 | 148 | func au (at) = at[i] | |
149 | 149 | ||
150 | 150 | ||
151 | 151 | func av (at) = at[j] | |
152 | 152 | ||
153 | 153 | ||
154 | 154 | func aw (at) = parseIntValue(at[k]) | |
155 | 155 | ||
156 | 156 | ||
157 | 157 | func ax (at) = at[l] | |
158 | 158 | ||
159 | 159 | ||
160 | 160 | func ay (at) = parseIntValue(at[m]) | |
161 | 161 | ||
162 | 162 | ||
163 | 163 | func az (at) = parseIntValue(at[n]) | |
164 | 164 | ||
165 | 165 | ||
166 | 166 | func aA (at) = at[o] | |
167 | 167 | ||
168 | 168 | ||
169 | 169 | func aB (at) = parseIntValue(at[p]) | |
170 | 170 | ||
171 | 171 | ||
172 | 172 | func aC (at) = parseIntValue(at[q]) | |
173 | 173 | ||
174 | 174 | ||
175 | 175 | func aD (at) = parseIntValue(at[r]) | |
176 | 176 | ||
177 | 177 | ||
178 | 178 | func aE (at) = parseIntValue(at[s]) | |
179 | 179 | ||
180 | 180 | ||
181 | 181 | func aF (at) = parseIntValue(at[t]) | |
182 | 182 | ||
183 | 183 | ||
184 | 184 | func aG (at) = parseIntValue(at[u]) | |
185 | 185 | ||
186 | 186 | ||
187 | 187 | func aH (at) = parseIntValue(at[v]) | |
188 | 188 | ||
189 | 189 | ||
190 | 190 | func aI (at) = parseIntValue(at[w]) | |
191 | 191 | ||
192 | 192 | ||
193 | 193 | func aJ (N) = valueOrElse(getString(this, V(N)), "") | |
194 | 194 | ||
195 | 195 | ||
196 | 196 | func aK (N) = valueOrElse(getInteger(this, Q(N)), 0) | |
197 | 197 | ||
198 | 198 | ||
199 | 199 | func aL (N) = valueOrElse(getInteger(this, R(N)), 0) | |
200 | 200 | ||
201 | 201 | ||
202 | 202 | func aM (N) = valueOrElse(getInteger(this, S(N)), 0) | |
203 | 203 | ||
204 | 204 | ||
205 | 205 | func aN (N) = valueOrElse(getInteger(this, T(N)), 0) | |
206 | 206 | ||
207 | 207 | ||
208 | 208 | func aO (N) = valueOrElse(getString(this, U(N)), "") | |
209 | 209 | ||
210 | 210 | ||
211 | 211 | func aP (N,aa) = valueOrElse(getInteger(this, Z(N, aa)), 0) | |
212 | 212 | ||
213 | 213 | ||
214 | 214 | func aQ (N,aa) = valueOrElse(getInteger(this, ab(N, aa)), 0) | |
215 | 215 | ||
216 | 216 | ||
217 | 217 | func aR (N,aa) = valueOrElse(getInteger(this, ac(N, aa)), 0) | |
218 | 218 | ||
219 | 219 | ||
220 | 220 | func aS (N,aa) = valueOrElse(getInteger(this, ad(N, aa)), 0) | |
221 | 221 | ||
222 | 222 | ||
223 | 223 | func aT (aU,P) = valueOrErrorMessage(getInteger(aU, O(P)), "No Asset price found") | |
224 | 224 | ||
225 | 225 | ||
226 | 226 | func aV (P,Y,aj,aW,aX,aY,aZ,aU,ba,bb,bc,bd,be,bf,bg,bh) = makeString(["%s%s%s%d%s%d%d%s%d%d%d%d%d%d%d", P, Y, aj, toString(aW), aX, toString(aY), toString(aZ), aU, toString(ba), toString(bb), toString(bc), toString(bd), toString(be), toString(bf), toString(bg), toString(bh)], "__") | |
227 | 227 | ||
228 | 228 | ||
229 | - | @Callable(bi) | |
230 | - | func init (bj,bk,bl,bm,am,bn,bo,bp) = if ((toBase58String(bi.callerPublicKey) != x)) | |
229 | + | func bi (bj,bk) = { | |
230 | + | let bl = as(bk) | |
231 | + | let bm = au(bk) | |
232 | + | let bn = aw(bk) | |
233 | + | let bo = ax(bk) | |
234 | + | let bp = ay(bk) | |
235 | + | let bq = az(bk) | |
236 | + | let br = aA(bk) | |
237 | + | let bs = aB(bk) | |
238 | + | let bt = aC(bk) | |
239 | + | let bu = aD(bk) | |
240 | + | let bv = aE(bk) | |
241 | + | let bw = aF(bk) | |
242 | + | let bx = aG(bk) | |
243 | + | let by = aH(bk) | |
244 | + | let bh = aI(bk) | |
245 | + | aV(bl, bm, bj, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bh) | |
246 | + | } | |
247 | + | ||
248 | + | ||
249 | + | @Callable(bz) | |
250 | + | func init (bA,bB,bC,bD,am,bE,bF,bG) = if ((toBase58String(bz.callerPublicKey) != x)) | |
231 | 251 | then throw("Only Admin can perform contract operation.") | |
232 | 252 | else if ((g(B) == true)) | |
233 | 253 | then throw("Contract was already initialized.") | |
234 | 254 | else { | |
235 | - | let | |
236 | - | let | |
237 | - | [StringEntry(y, | |
255 | + | let bH = Issue("DEFO_DEBT", "DEFO Debt Token.", 1, 6, true) | |
256 | + | let bI = calculateAssetId(bH) | |
257 | + | [StringEntry(y, bA), StringEntry(z, bB), IntegerEntry(A, bC), StringEntry(D, bD), IntegerEntry(C, am), IntegerEntry(F, bE), StringEntry(E, toBase58String(bI)), StringEntry(G, bF), StringEntry(H, bG), BooleanEntry(B, true), bH, Burn(bI, 1)] | |
238 | 258 | } | |
239 | 259 | ||
240 | 260 | ||
241 | 261 | ||
242 | - | @Callable( | |
243 | - | func proposeAsset (P, | |
262 | + | @Callable(bz) | |
263 | + | func proposeAsset (P,bJ,aZ,aU,aY,aX,aW,ba,bb,bc,bd,be,bf,bg,bh) = if ((toBase58String(bz.callerPublicKey) != x)) | |
244 | 264 | then throw("Only Admin can perform contract operation.") | |
245 | 265 | else if ((g(B) == false)) | |
246 | 266 | then throw("Contract is not yet ready.") | |
247 | 267 | else if ((fromBase58String(aX) != ag)) | |
248 | 268 | then throw("Baking asset id could be USDN only.") | |
249 | 269 | else if ((aq(P) != "")) | |
250 | 270 | then throw((("Asset with passed code " + P) + " has already been proposed.")) | |
251 | 271 | else if ((ai > aZ)) | |
252 | 272 | then throw(("Minimum pool amount should be greater or equals to " + toString(ai))) | |
253 | 273 | else if (if (if (if (if (if (if (if ((0 > aY)) | |
254 | 274 | then true | |
255 | 275 | else (0 > aW)) | |
256 | 276 | then true | |
257 | 277 | else (0 > ba)) | |
258 | 278 | then true | |
259 | 279 | else (0 > bb)) | |
260 | 280 | then true | |
261 | 281 | else (0 > bc)) | |
262 | 282 | then true | |
263 | 283 | else (0 > bd)) | |
264 | 284 | then true | |
265 | 285 | else (0 > be)) | |
266 | 286 | then true | |
267 | 287 | else (0 > bf)) | |
268 | 288 | then throw("One of the passed parameters is invalid.") | |
269 | 289 | else { | |
270 | - | let | |
290 | + | let bK = valueOrErrorMessage(addressFromStringValue(aU), "Passed Price Oracle Address is not valid.") | |
271 | 291 | let N = al[am] | |
272 | - | let | |
273 | - | [StringEntry(M(N), aV(P, | |
292 | + | let bL = valueOrErrorMessage(getString(valueOrErrorMessage(addressFromString(N), ""), K), "No defo asset ID found.") | |
293 | + | [StringEntry(M(N), aV(P, bL, aj._1, aW, aX, aY, aZ, aU, ba, bb, bc, bd, be, bf, bg, bh)), StringEntry(W(P), N), StringEntry(U(N), bJ), IntegerEntry(Q(N), height), IntegerEntry(C, (am + 1)), StringEntry(X(bL), N)] | |
274 | 294 | } | |
275 | 295 | ||
276 | 296 | ||
277 | 297 | ||
278 | - | @Callable( | |
298 | + | @Callable(bz) | |
279 | 299 | func fundLiquidityPool (P) = { | |
280 | 300 | let N = aq(P) | |
281 | - | let | |
282 | - | let | |
283 | - | if ((toBase58String( | |
301 | + | let bk = ae(N) | |
302 | + | let bM = value(bz.payments[0]) | |
303 | + | if ((toBase58String(bz.callerPublicKey) != x)) | |
284 | 304 | then throw("Only Admin can perform contract operation.") | |
285 | 305 | else if ((g(B) == false)) | |
286 | 306 | then throw("Contract is not yet ready.") | |
287 | - | else if (( | |
307 | + | else if ((bM.assetId != ag)) | |
288 | 308 | then throw("Liquidity pool could be funded with USDN only.") | |
289 | - | else if (( | |
309 | + | else if ((bM.amount == 0)) | |
290 | 310 | then throw("Incorrect attached payment amount.") | |
291 | 311 | else if ((N == "")) | |
292 | 312 | then throw((("Cannot find liquidity pool for asset " + P) + ".")) | |
293 | 313 | else { | |
294 | - | let | |
295 | - | let | |
296 | - | let aa = toString( | |
297 | - | let | |
298 | - | let | |
299 | - | let | |
300 | - | let | |
301 | - | then ( | |
314 | + | let bN = (bM.amount + aM(N)) | |
315 | + | let bO = aN(N) | |
316 | + | let aa = toString(bz.caller) | |
317 | + | let bP = aP(N, aa) | |
318 | + | let bQ = aQ(N, aa) | |
319 | + | let bR = av(bk) | |
320 | + | let bS = if (if ((bN >= az(bk))) | |
321 | + | then (bR == aj._1) | |
302 | 322 | else false) | |
303 | 323 | then aj._2 | |
304 | - | else | |
305 | - | let | |
306 | - | let | |
324 | + | else bR | |
325 | + | let bT = aJ(N) | |
326 | + | let bU = if ((bT == "")) | |
307 | 327 | then aa | |
308 | - | else if (contains(bD, aa)) | |
309 | - | then bD | |
310 | - | else ((bD + ",") + toString(bi.caller)) | |
311 | - | let bF = as(bv) | |
312 | - | let bG = au(bv) | |
313 | - | let bH = aw(bv) | |
314 | - | let bI = ax(bv) | |
315 | - | let bJ = ay(bv) | |
316 | - | let bK = az(bv) | |
317 | - | let bL = aA(bv) | |
318 | - | let bM = aB(bv) | |
319 | - | let bN = aC(bv) | |
320 | - | let bO = aD(bv) | |
321 | - | let bP = aE(bv) | |
322 | - | let bQ = aF(bv) | |
323 | - | let bR = aG(bv) | |
324 | - | let bS = aH(bv) | |
325 | - | let bh = aI(bv) | |
326 | - | let bT = (bz + bi.payments[0].amount) | |
327 | - | let bU = [IntegerEntry(Z(N, toString(bi.caller)), bT), IntegerEntry(ab(N, toString(bi.caller)), if ((bT > bA)) | |
328 | - | then bT | |
329 | - | else bA), IntegerEntry(S(N), bx), IntegerEntry(T(N), if ((bx > by)) | |
330 | - | then bx | |
331 | - | else by), DeleteEntry(M(N)), StringEntry(V(N), bE), StringEntry(M(N), aV(bF, bG, bC, bH, bI, bJ, bK, bL, bM, bN, bO, bP, bQ, bR, bS, bh))] | |
332 | - | if ((bB == aj._3)) | |
333 | - | then (bU :+ ScriptTransfer(addressFromStringValue(N), bw.amount, ag)) | |
334 | - | else bU | |
328 | + | else if (contains(bT, aa)) | |
329 | + | then bT | |
330 | + | else ((bT + ",") + toString(bz.caller)) | |
331 | + | let bV = (bP + bz.payments[0].amount) | |
332 | + | let bW = [IntegerEntry(Z(N, toString(bz.caller)), bV), IntegerEntry(ab(N, toString(bz.caller)), if ((bV > bQ)) | |
333 | + | then bV | |
334 | + | else bQ), IntegerEntry(S(N), bN), IntegerEntry(T(N), if ((bN > bO)) | |
335 | + | then bN | |
336 | + | else bO), StringEntry(V(N), bU), StringEntry(M(N), bi(bS, bk))] | |
337 | + | if ((bR == aj._3)) | |
338 | + | then (bW :+ ScriptTransfer(addressFromStringValue(N), bM.amount, ag)) | |
339 | + | else bW | |
335 | 340 | } | |
336 | 341 | } | |
337 | 342 | ||
338 | 343 | ||
339 | 344 | ||
340 | - | @Callable( | |
345 | + | @Callable(bz) | |
341 | 346 | func activateAsset (P) = { | |
342 | 347 | let N = aq(P) | |
343 | - | let bv = ae(N) | |
344 | - | let bV = aM(N) | |
345 | - | let bF = as(bv) | |
346 | - | let bW = av(bv) | |
347 | - | let bG = au(bv) | |
348 | - | let bH = aw(bv) | |
349 | - | let bI = ax(bv) | |
350 | - | let bJ = ay(bv) | |
351 | - | let bK = az(bv) | |
352 | - | let bL = aA(bv) | |
353 | - | let bM = aB(bv) | |
354 | - | let bN = aC(bv) | |
355 | - | let bO = aD(bv) | |
356 | - | let bP = aE(bv) | |
357 | - | let bQ = aF(bv) | |
358 | - | let bR = aG(bv) | |
359 | - | let bS = aH(bv) | |
360 | - | let bh = aI(bv) | |
361 | - | if ((toBase58String(bi.callerPublicKey) != x)) | |
348 | + | let bk = ae(N) | |
349 | + | let bX = aM(N) | |
350 | + | let bY = av(bk) | |
351 | + | if ((toBase58String(bz.callerPublicKey) != x)) | |
362 | 352 | then throw("Only Admin can perform contract operation.") | |
363 | 353 | else if ((g(B) == false)) | |
364 | 354 | then throw("Contract is not yet ready.") | |
365 | - | else if (( | |
366 | - | then throw((("Asset is not in READY status. Current status is " + | |
355 | + | else if ((bY != aj._2)) | |
356 | + | then throw((("Asset is not in READY status. Current status is " + bY) + ".")) | |
367 | 357 | else if ((N == "")) | |
368 | 358 | then throw((("Cannot find asset " + P) + ".")) | |
369 | - | else if ((ai > | |
370 | - | then throw((((("Cannot issue asset as liquidity pool amount (" + toString( | |
359 | + | else if ((ai > bX)) | |
360 | + | then throw((((("Cannot issue asset as liquidity pool amount (" + toString(bX)) + ") is less than required (") + toString(ai)) + ")")) | |
371 | 361 | else { | |
372 | - | let | |
373 | - | [IntegerEntry(R(N), height), | |
362 | + | let bH = Reissue(an, ap, true) | |
363 | + | [IntegerEntry(R(N), height), StringEntry(M(N), bi(aj._3, bk)), bH, ScriptTransfer(addressFromStringValue(N), bX, ag), ScriptTransfer(addressFromStringValue(N), ap, an)] | |
374 | 364 | } | |
375 | 365 | } | |
376 | 366 | ||
377 | 367 | ||
378 | 368 | ||
379 | - | @Callable( | |
380 | - | func redeemFromPool (P, | |
369 | + | @Callable(bz) | |
370 | + | func redeemFromPool (P,bZ) = { | |
381 | 371 | let N = aq(P) | |
382 | - | let | |
383 | - | let | |
384 | - | let | |
385 | - | let | |
386 | - | if ((toBase58String( | |
372 | + | let bk = ae(N) | |
373 | + | let ca = toString(bz.caller) | |
374 | + | let cb = aP(N, ca) | |
375 | + | let cc = aR(N, ca) | |
376 | + | if ((toBase58String(bz.callerPublicKey) != x)) | |
387 | 377 | then throw("Only Admin can perform contract operation.") | |
388 | 378 | else if ((g(B) == false)) | |
389 | 379 | then throw("Contract is not yet ready.") | |
390 | 380 | else if ((N == "")) | |
391 | 381 | then throw((("Cannot find asset " + P) + ".")) | |
392 | - | else if (if (if ((0 > | |
382 | + | else if (if (if ((0 > bZ)) | |
393 | 383 | then true | |
394 | - | else ( | |
384 | + | else (cb == 0)) | |
395 | 385 | then true | |
396 | - | else ( | |
397 | - | then throw((("Cannot find pool maker by address " + | |
398 | - | else if (( | |
386 | + | else (bZ > cb)) | |
387 | + | then throw((("Cannot find pool maker by address " + ca) + " or amount passed is not correct.")) | |
388 | + | else if ((cc > 0)) | |
399 | 389 | then throw("Pool maker already has initiated redemption that is not withdrawn yet.") | |
400 | - | else [IntegerEntry(ac(N, | |
390 | + | else [IntegerEntry(ac(N, ca), bZ), IntegerEntry(ad(N, ca), (height + aH(bk)))] | |
401 | 391 | } | |
402 | 392 | ||
403 | 393 | ||
404 | 394 | ||
405 | - | @Callable(bi) | |
395 | + | @Callable(bz) | |
396 | + | func getMaxAllowedAmountToRedeem (P,cd) = throw((((("{allowedAmountToRedeem: 1000, assetCode: " + P) + ", poolMaker: ") + cd) + "}")) | |
397 | + | ||
398 | + | ||
399 | + | ||
400 | + | @Callable(bz) | |
406 | 401 | func withdraw (P) = { | |
407 | - | let | |
402 | + | let bk = ae(P) | |
408 | 403 | let N = aq(P) | |
409 | - | let aU = addressFromStringValue(aA( | |
410 | - | let | |
411 | - | let | |
412 | - | let | |
413 | - | let | |
414 | - | let | |
415 | - | let | |
416 | - | let | |
417 | - | if ((toBase58String( | |
404 | + | let aU = addressFromStringValue(aA(bk)) | |
405 | + | let ca = toString(bz.caller) | |
406 | + | let ce = valueOrErrorMessage(assetInfo(fromBase58String(N)), ("Cannot find asset by id " + N)) | |
407 | + | let cf = assetBalance(this, ag) | |
408 | + | let cg = aP(N, ca) | |
409 | + | let cc = aR(N, ca) | |
410 | + | let ch = aS(N, ca) | |
411 | + | let ci = (aN(N) / aQ(N, ca)) | |
412 | + | if ((toBase58String(bz.callerPublicKey) != x)) | |
418 | 413 | then throw("Only Admin can perform contract operation.") | |
419 | 414 | else if ((g(B) == false)) | |
420 | 415 | then throw("Contract is not yet ready.") | |
421 | 416 | else if ((g(B) == false)) | |
422 | 417 | then throw("Contract is not yet ready.") | |
423 | 418 | else if ((N == "")) | |
424 | 419 | then throw((("Cannot find asset " + P) + ".")) | |
425 | - | else if (( | |
426 | - | then throw((("Cannot find pool maker by address " + | |
427 | - | else if ((height > | |
428 | - | then throw((("Please wait " + toString( | |
420 | + | else if ((cg == 0)) | |
421 | + | then throw((("Cannot find pool maker by address " + ca) + " or no locked amount.")) | |
422 | + | else if ((height > ch)) | |
423 | + | then throw((("Please wait " + toString(ch)) + " before withdraw.")) | |
429 | 424 | else { | |
430 | - | let | |
431 | - | let | |
432 | - | let | |
433 | - | let | |
434 | - | let | |
435 | - | if (( | |
425 | + | let cj = ce.quantity | |
426 | + | let ck = aT(aU, P) | |
427 | + | let cl = aR(N, ca) | |
428 | + | let cm = (ay(bk) * ck) | |
429 | + | let cn = (cm * cj) | |
430 | + | if ((cf > cn)) | |
436 | 431 | then { | |
437 | - | let | |
438 | - | let | |
439 | - | let | |
440 | - | [IntegerEntry(S(N), (aM(N) - | |
432 | + | let co = (cf - cn) | |
433 | + | let cp = (ci * co) | |
434 | + | let cq = (aR(N, ca) - cp) | |
435 | + | [IntegerEntry(S(N), (aM(N) - cp)), IntegerEntry(Z(N, ca), (aP(N, ca) - cp)), IntegerEntry(ac(N, ca), cq), ScriptTransfer(addressFromStringValue(ca), cp, ag)] | |
441 | 436 | } | |
442 | 437 | else nil | |
443 | 438 | } | |
444 | 439 | } | |
445 | 440 | ||
446 | 441 |
github/deemru/w8io/169f3d6 112.42 ms ◑