tx · 36fQejUN2YzRW7ooET6swSK1pmxdjwxwfafH8YBAXWyc 3Msx4Aq69zWUKy4d1wyKnQ4ofzEDAfv5Ngf: -0.04300000 Waves 2024.09.19 13:24 [3290416] smart account 3Msx4Aq69zWUKy4d1wyKnQ4ofzEDAfv5Ngf > SELF 0.00000000 Waves
{ "type": 13, "id": "36fQejUN2YzRW7ooET6swSK1pmxdjwxwfafH8YBAXWyc", "fee": 4300000, "feeAssetId": null, "timestamp": 1726741448101, "version": 2, "chainId": 84, "sender": "3Msx4Aq69zWUKy4d1wyKnQ4ofzEDAfv5Ngf", "senderPublicKey": "62i1XasxLi9NJmrEaq9UaHEGfZaonGKUL6EmFaA7gosh", "proofs": [ "5DHP71DFYdijMx12NxTQxGiuXsR5ZKxVwhua2zUFaK8qP7fcqwhBpBporBxmkiufwQtQyEvVKEH6M9VzDyp7LmPi" ], "script": "base64:CAJACAISBwoFCAgCCAESBwoFCAgCCAESCAoGCAgCAQgBEgYKBAgICAESAwoBCBIAEgMKAQgSBgoECBIBARIECgIIAUoAB0lOVF9NQVgA//////////9/AAVXQVZFUwCAwtcvAAtNSU5fQkFMQU5DRQkAaAIAoJwBBQVXQVZFUwADU0VQAgEsAA9CTE9DS19IQVNIX1NJWkUAIAAUUFVCTElDX0tFWV9IQVNIX1NJWkUAFAAOUk9PVF9IQVNIX1NJWkUAIAAUV0lUSERSQVdfUFJPT0ZTX1NJWkUACgAURVRIX0FERFJFU1NfU1RSX1NJWkUAKAAWTUFYX0NMX1RPX0VMX1RSQU5TRkVSUwAQAAl6ZXJvZXNTdHICgAgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAxhbGxNaW5lcnNLZXkCCWFsbE1pbmVycwAObWFpbkNoYWluSWRLZXkCC21haW5DaGFpbklkAA5sYXN0Q2hhaW5JZEtleQILbGFzdENoYWluSWQAF2ZpcnN0VmFsaWRBbHRDaGFpbklkS2V5AhRmaXJzdFZhbGlkQWx0Q2hhaW5JZAAObWluZXJSZXdhcmRLZXkCC21pbmVyUmV3YXJkAApibG9ja01ldGFLAghibG9ja18weAARZmluYWxpemVkQmxvY2tLZXkCDmZpbmFsaXplZEJsb2NrAAp0b2tlbklkS2V5Agd0b2tlbklkABJlbEJyaWRnZUFkZHJlc3NLZXkCD2VsQnJpZGdlQWRkcmVzcwAXbmF0aXZlVHJhbnNmZXJzQ291bnRLZXkCFG5hdGl2ZVRyYW5zZmVyc0NvdW50AQNwYWQBAWkEAXMJAKQDAQUBaQQHJG1hdGNoMAkAsQIBBQFzAwkAAAIAAQUHJG1hdGNoMAkArAICAgcwMDAwMDAwBQFzAwkAAAIAAgUHJG1hdGNoMAkArAICAgYwMDAwMDAFAXMDCQAAAgADBQckbWF0Y2gwCQCsAgICBTAwMDAwBQFzAwkAAAIABAUHJG1hdGNoMAkArAICAgQwMDAwBQFzAwkAAAIABQUHJG1hdGNoMAkArAICAgMwMDAFAXMDCQAAAgAGBQckbWF0Y2gwCQCsAgICAjAwBQFzAwkAAAIABwUHJG1hdGNoMAkArAICAgEwBQFzBQFzARRibG9ja0UyQ1RyYW5zZmVyc0tleQEMYmxvY2tIYXNoSGV4CQCsAgICEmVsVG9DbFRyYW5zZmVyc18weAUMYmxvY2tIYXNoSGV4AQxlcG9jaE1ldGFLZXkBBWVwb2NoCQCsAgICBmVwb2NoXwkBA3BhZAEFBWVwb2NoARRjaGFpbkZpcnN0QmxvY2tJZEtleQEHY2hhaW5JZAkArAICCQCsAgICBWNoYWluCQCkAwEFB2NoYWluSWQCCkZpcnN0QmxvY2sBDGNoYWluTWV0YUtleQEHY2hhaW5JZAkArAICAgZjaGFpbl8JAQNwYWQBBQdjaGFpbklkARJjaGFpbkxhc3RIZWlnaHRLZXkCB2NoYWluSWQFbWluZXIJAKwCAgkArAICCQCsAgICBmNoYWluXwkBA3BhZAEFB2NoYWluSWQCAV8JAKUIAQUFbWluZXIBFGNoYWluRm9ya2VkSGVpZ2h0S2V5AQdjaGFpbklkCQCsAgIJAKwCAgIGY2hhaW5fCQEDcGFkAQUHY2hhaW5JZAIMRm9ya2VkSGVpZ2h0AQ1zdXBwb3J0ZXJzS2V5AQdjaGFpbklkCQCsAgIJAKwCAgIFY2hhaW4JAKQDAQUHY2hhaW5JZAIKU3VwcG9ydGVycwEVbWluZXJSZXdhcmRBZGRyZXNzS2V5AQltaW5lckFkZHIJAKwCAgkArAICAgZtaW5lcl8FCW1pbmVyQWRkcgIOX1Jld2FyZEFkZHJlc3MBCm1pbmVyUGtLZXkBDXJld2FyZEFkZHJlc3MJAKwCAgkArAICAghtaW5lcl8weAUNcmV3YXJkQWRkcmVzcwIDX1BLAQ9taW5lckNoYWluSWRLZXkBBW1pbmVyCQCsAgIJAKwCAgIGbWluZXJfCQClCAEFBW1pbmVyAghfQ2hhaW5JZAAUbmF0aXZlVHJhbnNmZXJzQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXbmF0aXZlVHJhbnNmZXJzQ291bnRLZXkAAAERbmF0aXZlVHJhbnNmZXJLZXkBBWluZGV4CQCsAgICD25hdGl2ZVRyYW5zZmVyXwkApAMBBQVpbmRleAEVbWtOYXRpdmVUcmFuc2ZlckVudHJ5AwVpbmRleBBkZXN0RWxBZGRyZXNzSGV4BmFtb3VudAkBC1N0cmluZ0VudHJ5AgkBEW5hdGl2ZVRyYW5zZmVyS2V5AQUFaW5kZXgJAKwCAgkArAICCQCsAgICAjB4BRBkZXN0RWxBZGRyZXNzSGV4BQNTRVAJAKQDAQUGYW1vdW50ARZlbnN1cmVDb3JyZWN0VHJhbnNmZXJzAxByZWZUcmFuc2ZlckluZGV4DXRyYW5zZmVySW5kZXgMZXhwZWN0UmV3YXJkBAxtYXhUcmFuc2ZlcnMDBQxleHBlY3RSZXdhcmQJAGUCBRZNQVhfQ0xfVE9fRUxfVFJBTlNGRVJTAAEFFk1BWF9DTF9UT19FTF9UUkFOU0ZFUlMED2FjdHVhbFRyYW5zZmVycwkAZQIFDXRyYW5zZmVySW5kZXgFEHJlZlRyYW5zZmVySW5kZXgEC2NoZWNrTnVtYmVyAwkAZgIFD2FjdHVhbFRyYW5zZmVycwUMbWF4VHJhbnNmZXJzCQACAQkArAICCQCsAgIJAKwCAgINQWxsb3dlZCBvbmx5IAkApAMBBQxtYXhUcmFuc2ZlcnMCECB0cmFuc2ZlcnMsIGdvdCAJAKQDAQUPYWN0dWFsVHJhbnNmZXJzBgMJAAACBQtjaGVja051bWJlcgULY2hlY2tOdW1iZXIDCQBnAgUNdHJhbnNmZXJJbmRleAUUbmF0aXZlVHJhbnNmZXJzQ291bnQJAAIBCQCsAgIJAKwCAgkArAICAhVBdHRlbXB0IHRvIHRyYW5zZmVyICMJAKQDAQUNdHJhbnNmZXJJbmRleAIXLiBBdmFpbGFibGUgdHJhbnNmZXJzOiAJAKQDAQUUbmF0aXZlVHJhbnNmZXJzQ291bnQGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQphbW91bnRHdEVxAwF0BGd0RXEJcXVldWVTaXplAwkAZwIIBQF0BmFtb3VudAUEZ3RFcQYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhRUcmFuc2ZlcnJpbmcgYW1vdW50IAkApAMBCAUBdAZhbW91bnQCDiBzaG91bGQgYmUgPj0gCQCkAwEFBGd0RXECEyBmb3IgcXVldWUgc2l6ZSBvZiAJAKQDAQUJcXVldWVTaXplAhcuIFRyYW5zZmVyIG1vcmUgb3Igd2FpdAERZ2VuZXJhdGluZ0JhbGFuY2UBB2FkZHJlc3MICQDvBwEFB2FkZHJlc3MKZ2VuZXJhdGluZwEJY2hhaW5NZXRhAQdjaGFpbklkBAFzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEMY2hhaW5NZXRhS2V5AQUHY2hhaW5JZAQFaXRlbXMJALUJAgUBcwUDU0VQCQCUCgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVpdGVtcwAACQCRAwIFBWl0ZW1zAAEBEG1rQ2hhaW5NZXRhRW50cnkDB2NoYWluSWQObmV3Q2hhaW5IZWlnaHQMYmxvY2tIYXNoSGV4CQELU3RyaW5nRW50cnkCCQEMY2hhaW5NZXRhS2V5AQUHY2hhaW5JZAkArAICCQCsAgIJAKQDAQUObmV3Q2hhaW5IZWlnaHQFA1NFUAUMYmxvY2tIYXNoSGV4AAttYWluQ2hhaW5JZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ5tYWluQ2hhaW5JZEtleQAAAAskdDA1MDI5NTA5NQkBCWNoYWluTWV0YQEFC21haW5DaGFpbklkAA9tYWluQ2hhaW5IZWlnaHQIBQskdDA1MDI5NTA5NQJfMQASbWFpbkNoYWluTGFzdEJsb2NrCAULJHQwNTAyOTUwOTUCXzIBCWVwb2NoTWV0YQEFZXBvY2gEByRtYXRjaDAJAKIIAQkBDGVwb2NoTWV0YUtleQEFBWVwb2NoAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAQJZnJhZ21lbnRzCQC1CQIFAXMFA1NFUAkAlQoDCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFCWZyYWdtZW50cwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZnJhZ21lbnRzAAEJAJEDAgUJZnJhZ21lbnRzAAIFBHVuaXQACyR0MDUzMjY1NDUwBAckbWF0Y2gwCQEJZXBvY2hNZXRhAQUGaGVpZ2h0AwkAAQIFByRtYXRjaDACFihBZGRyZXNzLCBJbnQsIFN0cmluZykEAW0FByRtYXRjaDAFAW0JAJQKAgUEdW5pdAAAAA50aGlzRXBvY2hNaW5lcggFCyR0MDUzMjY1NDUwAl8xAAx0aGlzRXBvY2hSZWYIBQskdDA1MzI2NTQ1MAJfMgAMYWxsTWluZXJzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFDGFsbE1pbmVyc0tleQIAAAlhbGxNaW5lcnMEByRtYXRjaDAFDGFsbE1pbmVyc1N0cgMJAAACAgAFByRtYXRjaDAFA25pbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA3JhdwUHJG1hdGNoMAkAvAkCBQNyYXcFA1NFUAkAAgECC01hdGNoIGVycm9yAQlibG9ja01ldGEBB2Jsb2NrSWQEBG1ldGEJARFAZXh0ck5hdGl2ZSgxMDU3KQEJAKwCAgUKYmxvY2tNZXRhSwUHYmxvY2tJZAQIbWV0YVNpemUJAMgBAQUEbWV0YQQLYmxvY2tIZWlnaHQJALEJAQUEbWV0YQQKYmxvY2tFcG9jaAkAsgkCBQRtZXRhAAgEC2Jsb2NrUGFyZW50CQDJAQIJAMoBAgUEbWV0YQAQBQ9CTE9DS19IQVNIX1NJWkUEB2NoYWluSWQJALIJAgUEbWV0YQkAZAIAEAUPQkxPQ0tfSEFTSF9TSVpFBApiYXNlT2Zmc2V0CQBkAgAYBQ9CTE9DS19IQVNIX1NJWkUEDnJlbWFpbmluZ0J5dGVzCQBlAgUIbWV0YVNpemUFCmJhc2VPZmZzZXQEFGUyY1RyYW5zZmVyc1Jvb3RIYXNoAwkAZwIFDnJlbWFpbmluZ0J5dGVzBQ5ST09UX0hBU0hfU0laRQkAyQECCQDKAQIFBG1ldGEFCmJhc2VPZmZzZXQFDlJPT1RfSEFTSF9TSVpFAQAEFGxhc3RDMkVUcmFuc2ZlckluZGV4AwMJAAACBQ5yZW1haW5pbmdCeXRlcwAIBgkAZgIFDnJlbWFpbmluZ0J5dGVzBQ5ST09UX0hBU0hfU0laRQkAsgkCBQRtZXRhCQBkAgUKYmFzZU9mZnNldAkAyAEBBRRlMmNUcmFuc2ZlcnNSb290SGFzaAD///////////8BCQCYCgYFC2Jsb2NrSGVpZ2h0BQpibG9ja0Vwb2NoBQtibG9ja1BhcmVudAUHY2hhaW5JZAUUZTJjVHJhbnNmZXJzUm9vdEhhc2gFFGxhc3RDMkVUcmFuc2ZlckluZGV4ARBta0Jsb2NrTWV0YUVudHJ5BgxibG9ja0hhc2hIZXgLYmxvY2tIZWlnaHQOYmxvY2tQYXJlbnRIZXgHY2hhaW5JZBdlMmNUcmFuc2ZlcnNSb290SGFzaEhleBRsYXN0QzJFVHJhbnNmZXJJbmRleAQZZTJjVHJhbnNmZXJzUm9vdEhhc2hCeXRlcwkA3QQBBRdlMmNUcmFuc2ZlcnNSb290SGFzaEhleAQRcm9vdEhhc2hCeXRlc1NpemUJAMgBAQUZZTJjVHJhbnNmZXJzUm9vdEhhc2hCeXRlcwQNY2hlY2tSb290SGFzaAMDCQAAAgURcm9vdEhhc2hCeXRlc1NpemUAAAYJAAACBRFyb290SGFzaEJ5dGVzU2l6ZQUOUk9PVF9IQVNIX1NJWkUGCQACAQkArAICCQCsAgIJAKwCAgIlVHJhbnNmZXJzIHJvb3QgaGFzaCBzaG91bGQgaGF2ZSAwIG9yIAkApAMBBQ5ST09UX0hBU0hfU0laRQIMIGJ5dGVzLCBnb3QgCQCkAwEFEXJvb3RIYXNoQnl0ZXNTaXplAwkAAAIFDWNoZWNrUm9vdEhhc2gFDWNoZWNrUm9vdEhhc2gEDmJsb2NrTWV0YUJ5dGVzCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAmgMBBQtibG9ja0hlaWdodAkAmgMBBQZoZWlnaHQJAN0EAQUOYmxvY2tQYXJlbnRIZXgJAJoDAQUHY2hhaW5JZAUZZTJjVHJhbnNmZXJzUm9vdEhhc2hCeXRlcwkAmgMBBRRsYXN0QzJFVHJhbnNmZXJJbmRleAkBC0JpbmFyeUVudHJ5AgkArAICBQpibG9ja01ldGFLBQxibG9ja0hhc2hIZXgFDmJsb2NrTWV0YUJ5dGVzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxsYXN0SGVpZ2h0QnkCBW1pbmVyB2NoYWluSWQEByRtYXRjaDAJAJ8IAQkBEmNoYWluTGFzdEhlaWdodEtleQIFB2NoYWluSWQFBW1pbmVyAwkAAQIFByRtYXRjaDACA0ludAQBaAUHJG1hdGNoMAUBaAQJYmxvY2tIYXNoCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAKwCAgkArAICAgVjaGFpbgkApAMBBQdjaGFpbklkAgtMYXN0TWluZWRCeQkApQgBBQVtaW5lcggJAQlibG9ja01ldGEBBQlibG9ja0hhc2gCXzEACyR0MDc0OTA4NDI1BAloaXRTb3VyY2UEByRtYXRjaDAIBQlsYXN0QmxvY2sDdnJmAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA3ZyZgUHJG1hdGNoMAUDdnJmCAUJbGFzdEJsb2NrE2dlbmVyYXRpb25TaWduYXR1cmUKAQxwcm9jZXNzTWluZXICBHByZXYFbWluZXIECyR0MDc3NTc3ODIwBQRwcmV2BAlwcmV2TWluZXIIBQskdDA3NzU3NzgyMAJfMQQQcHJldlRvdGFsQmFsYW5jZQgFCyR0MDc3NTc3ODIwAl8yBAlwcmV2RGVsYXkIBQskdDA3NzU3NzgyMAJfMwQKcHJldk1pbmVycwgFCyR0MDc3NTc3ODIwAl80BAxtaW5lckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBW1pbmVyBA93YXZlc0dlbkJhbGFuY2UICQDvBwEFDG1pbmVyQWRkcmVzcwpnZW5lcmF0aW5nBAxtaW5lckJhbGFuY2UJARFnZW5lcmF0aW5nQmFsYW5jZQEFDG1pbmVyQWRkcmVzcwMDCQBmAgULTUlOX0JBTEFOQ0UFD3dhdmVzR2VuQmFsYW5jZQYJAGcCAAAFDG1pbmVyQmFsYW5jZQUEcHJldgQJbmV4dERlbGF5CQCFBwIFDG1pbmVyQWRkcmVzcwUMbWluZXJCYWxhbmNlAwkAZgIFCXByZXZEZWxheQUJbmV4dERlbGF5CQCWCgQFBW1pbmVyCQBkAgUQcHJldlRvdGFsQmFsYW5jZQUMbWluZXJCYWxhbmNlBQluZXh0RGVsYXkJAM0IAgUKcHJldk1pbmVycwUFbWluZXIJAJYKBAUJcHJldk1pbmVyCQBkAgUQcHJldlRvdGFsQmFsYW5jZQUMbWluZXJCYWxhbmNlBQlwcmV2RGVsYXkJAM0IAgUKcHJldk1pbmVycwUFbWluZXIKAAIkbAUJYWxsTWluZXJzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAgAAAAUHSU5UX01BWAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxwcm9jZXNzTWluZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgARY29tcHV0ZWRHZW5lcmF0b3IIBQskdDA3NDkwODQyNQJfMQAUY29tcHV0ZWRUb3RhbEJhbGFuY2UIBQskdDA3NDkwODQyNQJfMgALJHQwODQyNzg0OTMJAQlibG9ja01ldGEBBRJtYWluQ2hhaW5MYXN0QmxvY2sADG1jbGJJZ25vcmVkMQgFCyR0MDg0Mjc4NDkzAl8xAA5tYWluQ2hhaW5FcG9jaAgFCyR0MDg0Mjc4NDkzAl8yARtjYWxjdWxhdGVGaW5hbGl6ZWRCbG9ja0hhc2gDCGN1ck1pbmVyDGN1clByZXZFcG9jaBBjdXJMYXN0QmxvY2tIYXNoBAtvZmZzZXRzXzEwMAkAvAkCAmQ6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6AgAEC2hhbGZCYWxhbmNlCQBpAgUUY29tcHV0ZWRUb3RhbEJhbGFuY2UAAgoBBHN0ZXACBHByZXYEbmV4dAQLJHQwODg1OTg5MjMFBHByZXYECXRoaXNFcG9jaAgFCyR0MDg4NTk4OTIzAl8xBA5tYXliZVNhZmVFcG9jaAgFCyR0MDg4NTk4OTIzAl8yBAx0b3RhbEJhbGFuY2UIBQskdDA4ODU5ODkyMwJfMwQKcHJldk1pbmVycwgFCyR0MDg4NTk4OTIzAl80BAckbWF0Y2gwBQ5tYXliZVNhZmVFcG9jaAMJAAECBQckbWF0Y2gwAgRVbml0BAskdDA4OTgxOTE0NwMJAAACBQl0aGlzRXBvY2gFBmhlaWdodAkAlQoDBQhjdXJNaW5lcgUMY3VyUHJldkVwb2NoBRBjdXJMYXN0QmxvY2tIYXNoCQEFdmFsdWUBCQEJZXBvY2hNZXRhAQUJdGhpc0Vwb2NoBAVtaW5lcggFCyR0MDg5ODE5MTQ3Al8xBAlwcmV2RXBvY2gIBQskdDA4OTgxOTE0NwJfMgQNbGFzdEJsb2NrSGFzaAgFCyR0MDg5ODE5MTQ3Al8zAwMJAAACBQlwcmV2RXBvY2gAAAYJAGcCCQBlAgUGaGVpZ2h0BQl0aGlzRXBvY2gAZAkAlgoEBQl0aGlzRXBvY2gFDWxhc3RCbG9ja0hhc2gFDHRvdGFsQmFsYW5jZQUJYWxsTWluZXJzBAskdDA5MzAxOTUwMwMJAQ9jb250YWluc0VsZW1lbnQCBQpwcmV2TWluZXJzBQVtaW5lcgkAlAoCBQx0b3RhbEJhbGFuY2UFCnByZXZNaW5lcnMJAJQKAgkAZAIFDHRvdGFsQmFsYW5jZQkBEWdlbmVyYXRpbmdCYWxhbmNlAQUFbWluZXIJAMwIAgUFbWluZXIFCnByZXZNaW5lcnMED25ld1RvdGFsQmFsYW5jZQgFCyR0MDkzMDE5NTAzAl8xBAluZXdNaW5lcnMIBQskdDA5MzAxOTUwMwJfMgMJAGYCBQ9uZXdUb3RhbEJhbGFuY2UFC2hhbGZCYWxhbmNlCQCW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IGFsbG93ZWQgdG8gbWluZSBpbiAJAKQDAQUGaGVpZ2h0AhEgZXBvY2guIEV4cGVjdGVkIAURY29tcHV0ZWRHZW5lcmF0b3IFBHVuaXQBEmlzUmVmZXJlbmNlQ29ycmVjdAIJcmVmZXJlbmNlCWxhc3RCbG9jawMJAAACBQlyZWZlcmVuY2UFCWxhc3RCbG9jawUEdW5pdAkAAgEJAKwCAgkArAICCQCsAgICMEV4cGVjdGVkIGEgcmVmZXJlbmNlIHRvIHRoZSBjaGFpbiBsYXN0IGJsb2NrOiAweAUJbGFzdEJsb2NrAgkuIEdvdDogMHgFCXJlZmVyZW5jZQEPY2hhaW5Jc0luYWN0aXZlAQdjaGFpbklkBAxmaXJzdEJsb2NrSWQJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARRjaGFpbkZpcnN0QmxvY2tJZEtleQEFB2NoYWluSWQEFGZpcnN0VmFsaWRBbHRDaGFpbklkCQELdmFsdWVPckVsc2UCCQCfCAEFF2ZpcnN0VmFsaWRBbHRDaGFpbklkS2V5AAADCQBmAgUUZmlyc3RWYWxpZEFsdENoYWluSWQFB2NoYWluSWQGCQBmAggJAQlibG9ja01ldGEBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRFmaW5hbGl6ZWRCbG9ja0tleQJfMQgJAQlibG9ja01ldGEBBQxmaXJzdEJsb2NrSWQCXzEBDG1pbmVyQ2hhaW5JZAEFbWluZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBD21pbmVyQ2hhaW5JZEtleQEFBW1pbmVyCQCfCAEJAKwCAgIJY2hhaW5JZE9mCQClCAEFBW1pbmVyAR1lbnN1cmVFeHBlY3RlZE9ySW5hY3RpdmVDaGFpbgMJZ2VuZXJhdG9yD2V4cGVjdGVkQ2hhaW5JZBBjaGVja0hlaWdodEJsb2NrBA9oZWlnaHRJc0NvcnJlY3QEByRtYXRjaDAFEGNoZWNrSGVpZ2h0QmxvY2sDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAlibG9ja0hhc2gFByRtYXRjaDAEFGxhc3RNaW5lZEJsb2NrSGVpZ2h0CQEMbGFzdEhlaWdodEJ5AgUJZ2VuZXJhdG9yBQttYWluQ2hhaW5JZAkAZgIJAGQCCAkBCWJsb2NrTWV0YQEFCWJsb2NrSGFzaAJfMQABBRRsYXN0TWluZWRCbG9ja0hlaWdodAYEByRtYXRjaDAJAQxtaW5lckNoYWluSWQBBQlnZW5lcmF0b3IDCQABAgUHJG1hdGNoMAIDSW50BAljdXJyZW50SWQFByRtYXRjaDADAwkAAAIFCWN1cnJlbnRJZAUPZXhwZWN0ZWRDaGFpbklkBgMJAQ9jaGFpbklzSW5hY3RpdmUBBQljdXJyZW50SWQFD2hlaWdodElzQ29ycmVjdAcFBHVuaXQJAAIBCQCsAgICHG1pbmVyIGlzIG1pbmluZyBvdGhlciBjaGFpbiAJAKQDAQUJY3VycmVudElkBQR1bml0AAxoZWlnaHRTdHJpbmcJAKwCAgILIGF0IGhlaWdodCAJAKQDAQUGaGVpZ2h0AQV2cmZBdAEGaGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAO0HAQUGaGVpZ2h0CQCsAgICG2xhc3QgYmxvY2sgaXMgbm90IGF2YWlsYWJsZQUMaGVpZ2h0U3RyaW5nA3ZyZgkArAICAhRWUkYgaXMgbm90IGF2YWlsYWJsZQUMaGVpZ2h0U3RyaW5nARJlbnN1cmVDb3JyZWN0RXBvY2gBC2V4cGVjdGVkVlJGBAlhY3R1YWxWUkYJAQV2cmZBdAEFBmhlaWdodAMJAAACBQtleHBlY3RlZFZSRgUJYWN0dWFsVlJGBQR1bml0CQACAQkArAICCQCsAgIJAKwCAgkArAICAg1FeHBlY3RlZCBWUkYgCQDYBAEFC2V4cGVjdGVkVlJGAhcgZG9lcyBub3QgbWF0Y2ggYWN0dWFsIAkA2AQBBQlhY3R1YWxWUkYFDGhlaWdodFN0cmluZwEMYWRkU3VwcG9ydGVyAgdjaGFpbklkCWdlbmVyYXRvcgQNc3VwcG9ydGVyc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBDXN1cHBvcnRlcnNLZXkBBQdjaGFpbklkBApzdXBwb3J0ZXJzCQC8CQIFDXN1cHBvcnRlcnNTdHIFA1NFUAMJAQ9jb250YWluc0VsZW1lbnQCBQpzdXBwb3J0ZXJzCQClCAEFCWdlbmVyYXRvcgUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1zdXBwb3J0ZXJzS2V5AQUHY2hhaW5JZAkArAICCQCsAgIFDXN1cHBvcnRlcnNTdHIFA1NFUAkApQgBBQlnZW5lcmF0b3IFA25pbAEJc2V0T3JGYWlsAgVmbGFncwVpbmRleAMJAGYCAAAFBWluZGV4CQACAQkArAICAiJDYW4ndCB3aXRoZHJhdyBhdCBuZWdhdGl2ZSBpbmRleDogCQCkAwEFBWluZGV4BAlmbGFnc1NpemUJALECAQUFZmxhZ3MDCQBnAgUFaW5kZXgFCWZsYWdzU2l6ZQQJYWRkWmVyb2VzCQBlAgUFaW5kZXgFCWZsYWdzU2l6ZQMJAGYCBQlhZGRaZXJvZXMJALECAQUJemVyb2VzU3RyCQACAQkArAICCQCsAgICCkNhbid0IGFkZCAJAKQDAQUJYWRkWmVyb2VzAiUgZW1wdHkgZmxhZ3MuIENvbnRhY3Qgd2l0aCBkZXZlbG9wZXJzCQCsAgIJAKwCAgUFZmxhZ3MJAK8CAgUJemVyb2VzU3RyBQlhZGRaZXJvZXMCATEEBHRhaWwJALACAgUFZmxhZ3MFBWluZGV4BAdhdEluZGV4CQCvAgIFBHRhaWwAAQMJAAACBQdhdEluZGV4AgEwCQCsAgIJAKwCAgkArwICBQVmbGFncwUFaW5kZXgCATEJALACAgUEdGFpbAABCQACAQkArAICCQCsAgICClRyYW5zZmVyICMJAKQDAQUFaW5kZXgCFyBoYXMgYmVlbiBhbHJlYWR5IHRha2VuARF2YWxpZGF0ZUJsb2NrSGFzaAEGaGV4U3RyBAxkZWNvZGVkQnl0ZXMJAN0EAQUGaGV4U3RyAwkBAiE9AgkAyAEBBQxkZWNvZGVkQnl0ZXMFD0JMT0NLX0hBU0hfU0laRQkAAgECF2ludmFsaWQgYmxvY2sgaWQgbGVuZ3RoBQZoZXhTdHIBHWdldFVwZGF0ZUZpbmFsaXplZEJsb2NrQWN0aW9uAwZjYWxsZXIPbmV3QmxvY2tIYXNoSGV4CXByZXZFcG9jaAQXY3VyRmluYWxpemVkQmxvY2tIZWlnaHQICQEJYmxvY2tNZXRhAQkBEUBleHRyTmF0aXZlKDEwNTgpAQURZmluYWxpemVkQmxvY2tLZXkCXzEEFW5ld0ZpbmFsaXplZEJsb2NrSGFzaAkBG2NhbGN1bGF0ZUZpbmFsaXplZEJsb2NrSGFzaAMFBmNhbGxlcgUJcHJldkVwb2NoBQ9uZXdCbG9ja0hhc2hIZXgDAwkAAAIFFW5ld0ZpbmFsaXplZEJsb2NrSGFzaAUPbmV3QmxvY2tIYXNoSGV4BgkAZgIICQEJYmxvY2tNZXRhAQUVbmV3RmluYWxpemVkQmxvY2tIYXNoAl8xBRdjdXJGaW5hbGl6ZWRCbG9ja0hlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCBRFmaW5hbGl6ZWRCbG9ja0tleQUVbmV3RmluYWxpemVkQmxvY2tIYXNoBQNuaWwFA25pbAkBaQEPZXh0ZW5kTWFpbkNoYWluBQxibG9ja0hhc2hIZXgMcmVmZXJlbmNlSGV4A3ZyZhdlMmNUcmFuc2ZlcnNSb290SGFzaEhleBRsYXN0QzJFVHJhbnNmZXJJbmRleAQOY2hlY2tCbG9ja0hhc2gJARF2YWxpZGF0ZUJsb2NrSGFzaAEFDGJsb2NrSGFzaEhleAMJAAACBQ5jaGVja0Jsb2NrSGFzaAUOY2hlY2tCbG9ja0hhc2gECmNoZWNrRXBvY2gJARJlbnN1cmVDb3JyZWN0RXBvY2gBBQN2cmYDCQAAAgUKY2hlY2tFcG9jaAUKY2hlY2tFcG9jaAQKY2hlY2tDaGFpbgkBHWVuc3VyZUV4cGVjdGVkT3JJbmFjdGl2ZUNoYWluAwgFAWkMb3JpZ2luQ2FsbGVyBQttYWluQ2hhaW5JZAUEdW5pdAMJAAACBQpjaGVja0NoYWluBQpjaGVja0NoYWluBA5jaGVja1JlZmVyZW5jZQkBEmlzUmVmZXJlbmNlQ29ycmVjdAIFDHJlZmVyZW5jZUhleAUSbWFpbkNoYWluTGFzdEJsb2NrAwkAAAIFDmNoZWNrUmVmZXJlbmNlBQ5jaGVja1JlZmVyZW5jZQQOY2hlY2tUcmFuc2ZlcnMJARZlbnN1cmVDb3JyZWN0VHJhbnNmZXJzAwgJAQlibG9ja01ldGEBBQxyZWZlcmVuY2VIZXgCXzYFFGxhc3RDMkVUcmFuc2ZlckluZGV4BgMJAAACBQ5jaGVja1RyYW5zZmVycwUOY2hlY2tUcmFuc2ZlcnMEDXRoaXNFcG9jaE1ldGEEByRtYXRjaDAJAQllcG9jaE1ldGEBBQZoZWlnaHQDCQABAgUHJG1hdGNoMAIEVW5pdAkBC1N0cmluZ0VudHJ5AgkBDGVwb2NoTWV0YUtleQEFBmhlaWdodAkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpDG9yaWdpbkNhbGxlcgUDU0VQCQCkAwEFDm1haW5DaGFpbkVwb2NoBQNTRVAFDGJsb2NrSGFzaEhleAQFb3RoZXIFByRtYXRjaDAJAAIBAhVFcG9jaCBhbHJlYWR5IHN0YXJ0ZWQDCQAAAgUNdGhpc0Vwb2NoTWV0YQUNdGhpc0Vwb2NoTWV0YQQOY2hlY2tHZW5lcmF0b3IJARFlbnN1cmVNaW5pbmdFcG9jaAEIBQFpDG9yaWdpbkNhbGxlcgMJAAACBQ5jaGVja0dlbmVyYXRvcgUOY2hlY2tHZW5lcmF0b3IEFHVwZGF0ZUZpbmFsaXplZEJsb2NrCQEdZ2V0VXBkYXRlRmluYWxpemVkQmxvY2tBY3Rpb24DCAUBaQxvcmlnaW5DYWxsZXIFDGJsb2NrSGFzaEhleAUObWFpbkNoYWluRXBvY2gEDm5ld0NoYWluSGVpZ2h0CQBkAgUPbWFpbkNoYWluSGVpZ2h0AAEJAM4IAgkAzAgCCQEQbWtCbG9ja01ldGFFbnRyeQYFDGJsb2NrSGFzaEhleAUObmV3Q2hhaW5IZWlnaHQFEm1haW5DaGFpbkxhc3RCbG9jawULbWFpbkNoYWluSWQFF2UyY1RyYW5zZmVyc1Jvb3RIYXNoSGV4BRRsYXN0QzJFVHJhbnNmZXJJbmRleAkAzAgCCQEQbWtDaGFpbk1ldGFFbnRyeQMFC21haW5DaGFpbklkBQ5uZXdDaGFpbkhlaWdodAUMYmxvY2tIYXNoSGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPbWluZXJDaGFpbklkS2V5AQgFAWkMb3JpZ2luQ2FsbGVyBQttYWluQ2hhaW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmNoYWluTGFzdEhlaWdodEtleQIFC21haW5DaGFpbklkCAUBaQxvcmlnaW5DYWxsZXIFDm5ld0NoYWluSGVpZ2h0CQDMCAIFDXRoaXNFcG9jaE1ldGEFA25pbAUUdXBkYXRlRmluYWxpemVkQmxvY2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENc3RhcnRBbHRDaGFpbgUMYmxvY2tIYXNoSGV4DHJlZmVyZW5jZUhleAN2cmYXZTJjVHJhbnNmZXJzUm9vdEhhc2hIZXgUbGFzdEMyRVRyYW5zZmVySW5kZXgEDmNoZWNrQmxvY2tIYXNoCQERdmFsaWRhdGVCbG9ja0hhc2gBBQxibG9ja0hhc2hIZXgDCQAAAgUOY2hlY2tCbG9ja0hhc2gFDmNoZWNrQmxvY2tIYXNoBApjaGVja0Vwb2NoCQESZW5zdXJlQ29ycmVjdEVwb2NoAQUDdnJmAwkAAAIFCmNoZWNrRXBvY2gFCmNoZWNrRXBvY2gEDSR0MDE2MTMyMTYyNDUJAQlibG9ja01ldGEBBQxyZWZlcmVuY2VIZXgEDnJlZkNoYWluSGVpZ2h0CAUNJHQwMTYxMzIxNjI0NQJfMQQIcmVmRXBvY2gIBQ0kdDAxNjEzMjE2MjQ1Al8yBAtyZWZJZ25vcmVkMQgFDSR0MDE2MTMyMTYyNDUCXzMEC3JlZklnbm9yZWQyCAUNJHQwMTYxMzIxNjI0NQJfNAQLcmVmSWdub3JlZDMIBQ0kdDAxNjEzMjE2MjQ1Al81BBByZWZUcmFuc2ZlckluZGV4CAUNJHQwMTYxMzIxNjI0NQJfNgQOZmluYWxpemVkRXBvY2gICQEJYmxvY2tNZXRhAQkBEUBleHRyTmF0aXZlKDEwNTgpAQURZmluYWxpemVkQmxvY2tLZXkCXzIECGVwb2NoUmVmAwkAZwIFCHJlZkVwb2NoBQ5maW5hbGl6ZWRFcG9jaAUIcmVmRXBvY2gJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICI0NhbiBub3Qgc3RhcnQgYWx0IGNoYWluIGZyb20gZXBvY2ggCQCkAwEFCHJlZkVwb2NoAggsIGVwb2NoIAkApAMBBQ5maW5hbGl6ZWRFcG9jaAINIGlzIGZpbmFsaXplZAQKY2hlY2tDaGFpbgkBHWVuc3VyZUV4cGVjdGVkT3JJbmFjdGl2ZUNoYWluAwgFAWkMb3JpZ2luQ2FsbGVyBQttYWluQ2hhaW5JZAUMcmVmZXJlbmNlSGV4AwkAAAIFCmNoZWNrQ2hhaW4FCmNoZWNrQ2hhaW4EDmNoZWNrVHJhbnNmZXJzCQEWZW5zdXJlQ29ycmVjdFRyYW5zZmVycwMFEHJlZlRyYW5zZmVySW5kZXgFFGxhc3RDMkVUcmFuc2ZlckluZGV4BgMJAAACBQ5jaGVja1RyYW5zZmVycwUOY2hlY2tUcmFuc2ZlcnMECm5ld0NoYWluSWQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFDmxhc3RDaGFpbklkS2V5AAAAAQQObmV3Q2hhaW5IZWlnaHQJAGQCBQ5yZWZDaGFpbkhlaWdodAABBA10aGlzRXBvY2hNZXRhBAckbWF0Y2gwCQEJZXBvY2hNZXRhAQUGaGVpZ2h0AwkAAQIFByRtYXRjaDACBFVuaXQJAQtTdHJpbmdFbnRyeQIJAQxlcG9jaE1ldGFLZXkBBQZoZWlnaHQJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFA1NFUAkApAMBBQhlcG9jaFJlZgUDU0VQBQxibG9ja0hhc2hIZXgEBW90aGVyBQckbWF0Y2gwCQACAQIVRXBvY2ggYWxyZWFkeSBzdGFydGVkBA5jaGVja0dlbmVyYXRvcgkBEWVuc3VyZU1pbmluZ0Vwb2NoAQgFAWkMb3JpZ2luQ2FsbGVyAwkAAAIFDmNoZWNrR2VuZXJhdG9yBQ5jaGVja0dlbmVyYXRvcgkAzAgCBQ10aGlzRXBvY2hNZXRhCQDMCAIJARBta0Jsb2NrTWV0YUVudHJ5BgUMYmxvY2tIYXNoSGV4BQ5uZXdDaGFpbkhlaWdodAUMcmVmZXJlbmNlSGV4BQpuZXdDaGFpbklkBRdlMmNUcmFuc2ZlcnNSb290SGFzaEhleAUUbGFzdEMyRVRyYW5zZmVySW5kZXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGNoYWluRmlyc3RCbG9ja0lkS2V5AQUKbmV3Q2hhaW5JZAUMYmxvY2tIYXNoSGV4CQDMCAIJARBta0NoYWluTWV0YUVudHJ5AwUKbmV3Q2hhaW5JZAUObmV3Q2hhaW5IZWlnaHQFDGJsb2NrSGFzaEhleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD21pbmVyQ2hhaW5JZEtleQEIBQFpDG9yaWdpbkNhbGxlcgUKbmV3Q2hhaW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmNoYWluTGFzdEhlaWdodEtleQIFCm5ld0NoYWluSWQIBQFpDG9yaWdpbkNhbGxlcgUObmV3Q2hhaW5IZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJjaGFpbkxhc3RIZWlnaHRLZXkCBQttYWluQ2hhaW5JZAgFAWkMb3JpZ2luQ2FsbGVyBQ5uZXdDaGFpbkhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQENc3VwcG9ydGVyc0tleQEFCm5ld0NoYWluSWQJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5sYXN0Q2hhaW5JZEtleQUKbmV3Q2hhaW5JZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmV4dGVuZEFsdENoYWluBgxibG9ja0hhc2hIZXgMcmVmZXJlbmNlSGV4A3ZyZgdjaGFpbklkF2UyY1RyYW5zZmVyc1Jvb3RIYXNoSGV4FGxhc3RDMkVUcmFuc2ZlckluZGV4BA5jaGVja0Jsb2NrSGFzaAkBEXZhbGlkYXRlQmxvY2tIYXNoAQUMYmxvY2tIYXNoSGV4AwkAAAIFDmNoZWNrQmxvY2tIYXNoBQ5jaGVja0Jsb2NrSGFzaAQKY2hlY2tFcG9jaAkBEmVuc3VyZUNvcnJlY3RFcG9jaAEFA3ZyZgMJAAACBQpjaGVja0Vwb2NoBQpjaGVja0Vwb2NoBBNjaGFpbkZpcnN0QmxvY2tNZXRhCQEJYmxvY2tNZXRhAQkBEUBleHRyTmF0aXZlKDEwNTgpAQkBFGNoYWluRmlyc3RCbG9ja0lkS2V5AQUHY2hhaW5JZAQKY2hlY2tDaGFpbgkBHWVuc3VyZUV4cGVjdGVkT3JJbmFjdGl2ZUNoYWluAwgFAWkMb3JpZ2luQ2FsbGVyBQdjaGFpbklkCQDcBAEIBRNjaGFpbkZpcnN0QmxvY2tNZXRhAl8zAwkAAAIFCmNoZWNrQ2hhaW4FCmNoZWNrQ2hhaW4EDSR0MDE4NTU4MTg2MTIJAQljaGFpbk1ldGEBBQdjaGFpbklkBAtjaGFpbkhlaWdodAgFDSR0MDE4NTU4MTg2MTICXzEEDmNoYWluTGFzdEJsb2NrCAUNJHQwMTg1NTgxODYxMgJfMgQOY2hlY2tSZWZlcmVuY2UJARJpc1JlZmVyZW5jZUNvcnJlY3QCBQxyZWZlcmVuY2VIZXgFDmNoYWluTGFzdEJsb2NrAwkAAAIFDmNoZWNrUmVmZXJlbmNlBQ5jaGVja1JlZmVyZW5jZQQOY2hlY2tUcmFuc2ZlcnMJARZlbnN1cmVDb3JyZWN0VHJhbnNmZXJzAwgJAQlibG9ja01ldGEBBQxyZWZlcmVuY2VIZXgCXzYFFGxhc3RDMkVUcmFuc2ZlckluZGV4BgMJAAACBQ5jaGVja1RyYW5zZmVycwUOY2hlY2tUcmFuc2ZlcnMEDm5ld0NoYWluSGVpZ2h0CQBkAgULY2hhaW5IZWlnaHQAAQQJcHJldkVwb2NoCAkBCWJsb2NrTWV0YQEFDHJlZmVyZW5jZUhleAJfMgQTdXBkYXRlTWFpbkNoYWluRGF0YQMJAGYCCQERc3VwcG9ydGluZ0JhbGFuY2UBBQdjaGFpbklkCQBpAgUUY29tcHV0ZWRUb3RhbEJhbGFuY2UAAgQLbGFzdENoYWluSWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUObGFzdENoYWluSWRLZXkAAAQUdXBkYXRlRmluYWxpemVkQmxvY2sJAR1nZXRVcGRhdGVGaW5hbGl6ZWRCbG9ja0FjdGlvbgMIBQFpDG9yaWdpbkNhbGxlcgUMYmxvY2tIYXNoSGV4BQlwcmV2RXBvY2gJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGNoYWluRm9ya2VkSGVpZ2h0S2V5AQULbWFpbkNoYWluSWQIBRNjaGFpbkZpcnN0QmxvY2tNZXRhAl8xCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5tYWluQ2hhaW5JZEtleQUHY2hhaW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXZmlyc3RWYWxpZEFsdENoYWluSWRLZXkJAGQCBQtsYXN0Q2hhaW5JZAABBQNuaWwFFHVwZGF0ZUZpbmFsaXplZEJsb2NrBQNuaWwEDXRoaXNFcG9jaE1ldGEEByRtYXRjaDAJAQllcG9jaE1ldGEBBQZoZWlnaHQDCQABAgUHJG1hdGNoMAIEVW5pdAkBC1N0cmluZ0VudHJ5AgkBDGVwb2NoTWV0YUtleQEFBmhlaWdodAkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpDG9yaWdpbkNhbGxlcgUDU0VQCQCkAwEFCXByZXZFcG9jaAUDU0VQBQxibG9ja0hhc2hIZXgEBW90aGVyBQckbWF0Y2gwCQACAQIVRXBvY2ggYWxyZWFkeSBzdGFydGVkAwkAAAIFDXRoaXNFcG9jaE1ldGEFDXRoaXNFcG9jaE1ldGEEDmNoZWNrR2VuZXJhdG9yCQERZW5zdXJlTWluaW5nRXBvY2gBCAUBaQxvcmlnaW5DYWxsZXIDCQAAAgUOY2hlY2tHZW5lcmF0b3IFDmNoZWNrR2VuZXJhdG9yBB11cGRhdGVNYWluQ2hhaW5MYXN0TWluZWRCbG9jawMDCQAAAgUTdXBkYXRlTWFpbkNoYWluRGF0YQUDbmlsCQECIT0CCQELdmFsdWVPckVsc2UCCQEMbWluZXJDaGFpbklkAQgFAWkMb3JpZ2luQ2FsbGVyAAAFB2NoYWluSWQHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESY2hhaW5MYXN0SGVpZ2h0S2V5AgULbWFpbkNoYWluSWQIBQFpDG9yaWdpbkNhbGxlcggFE2NoYWluRmlyc3RCbG9ja01ldGECXzEFA25pbAUDbmlsCQDOCAIJAM4IAgkAzggCCQDMCAIJARBta0Jsb2NrTWV0YUVudHJ5BgUMYmxvY2tIYXNoSGV4BQ5uZXdDaGFpbkhlaWdodAUMcmVmZXJlbmNlSGV4BQdjaGFpbklkBRdlMmNUcmFuc2ZlcnNSb290SGFzaEhleAUUbGFzdEMyRVRyYW5zZmVySW5kZXgJAMwIAgkBEG1rQ2hhaW5NZXRhRW50cnkDBQdjaGFpbklkBQ5uZXdDaGFpbkhlaWdodAUMYmxvY2tIYXNoSGV4CQDMCAIFDXRoaXNFcG9jaE1ldGEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9taW5lckNoYWluSWRLZXkBCAUBaQxvcmlnaW5DYWxsZXIFB2NoYWluSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJjaGFpbkxhc3RIZWlnaHRLZXkCBQdjaGFpbklkCAUBaQxvcmlnaW5DYWxsZXIFDm5ld0NoYWluSGVpZ2h0BQNuaWwFE3VwZGF0ZU1haW5DaGFpbkRhdGEJAQxhZGRTdXBwb3J0ZXICBQdjaGFpbklkCAUBaQxvcmlnaW5DYWxsZXIFHXVwZGF0ZU1haW5DaGFpbkxhc3RNaW5lZEJsb2NrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2FwcGVuZEJsb2NrBAxibG9ja0hhc2hIZXgMcmVmZXJlbmNlSGV4F2UyY1RyYW5zZmVyc1Jvb3RIYXNoSGV4FGxhc3RDMkVUcmFuc2ZlckluZGV4BAtjaGVja0NhbGxlcgMJAAACBQ50aGlzRXBvY2hNaW5lcggFAWkMb3JpZ2luQ2FsbGVyBgQHJG1hdGNoMAUOdGhpc0Vwb2NoTWluZXIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQKZXBvY2hNaW5lcgUHJG1hdGNoMAkAAgEJAKwCAgI5bm90IGFsbG93ZWQgdG8gZm9yZ2UgYmxvY2tzIGluIHRoaXMgZXBvY2gsIGV4cGVjdGVkIGZyb20gCQClCAEFCmVwb2NoTWluZXIJAAIBAkBub3QgYWxsb3dlZCB0byBmb3JnZSBibG9ja3MgaW4gdGhpcyBlcG9jaCwgZXBvY2ggbWluZXIgaXMgYWJzZW50AwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQHY2hhaW5JZAkBC3ZhbHVlT3JFbHNlAgkBDG1pbmVyQ2hhaW5JZAEIBQFpDG9yaWdpbkNhbGxlcgULbWFpbkNoYWluSWQEDSR0MDIwOTYxMjEwMTIJAQljaGFpbk1ldGEBBQdjaGFpbklkBAtjaGFpbkhlaWdodAgFDSR0MDIwOTYxMjEwMTICXzEEC2xhc3RCbG9ja0lkCAUNJHQwMjA5NjEyMTAxMgJfMgQOY2hlY2tSZWZlcmVuY2UJARJpc1JlZmVyZW5jZUNvcnJlY3QCBQxyZWZlcmVuY2VIZXgFC2xhc3RCbG9ja0lkAwkAAAIFDmNoZWNrUmVmZXJlbmNlBQ5jaGVja1JlZmVyZW5jZQQOY2hlY2tUcmFuc2ZlcnMJARZlbnN1cmVDb3JyZWN0VHJhbnNmZXJzAwgJAQlibG9ja01ldGEBBQxyZWZlcmVuY2VIZXgCXzYFFGxhc3RDMkVUcmFuc2ZlckluZGV4BwMJAAACBQ5jaGVja1RyYW5zZmVycwUOY2hlY2tUcmFuc2ZlcnMEDm5ld0NoYWluSGVpZ2h0CQBkAgULY2hhaW5IZWlnaHQAAQQOY2hlY2tCbG9ja0hhc2gJARF2YWxpZGF0ZUJsb2NrSGFzaAEFDGJsb2NrSGFzaEhleAMJAAACBQ5jaGVja0Jsb2NrSGFzaAUOY2hlY2tCbG9ja0hhc2gJAMwIAgkBEG1rQmxvY2tNZXRhRW50cnkGBQxibG9ja0hhc2hIZXgFDm5ld0NoYWluSGVpZ2h0BQtsYXN0QmxvY2tJZAUHY2hhaW5JZAUXZTJjVHJhbnNmZXJzUm9vdEhhc2hIZXgFFGxhc3RDMkVUcmFuc2ZlckluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESY2hhaW5MYXN0SGVpZ2h0S2V5AgUHY2hhaW5JZAgFAWkMb3JpZ2luQ2FsbGVyBQ5uZXdDaGFpbkhlaWdodAkAzAgCCQEQbWtDaGFpbk1ldGFFbnRyeQMFB2NoYWluSWQFDm5ld0NoYWluSGVpZ2h0BQxibG9ja0hhc2hIZXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGVwb2NoTWV0YUtleQEFBmhlaWdodAkArAICCQCsAgIJAKwCAgkArAICCQClCAEJAQV2YWx1ZQEFDnRoaXNFcG9jaE1pbmVyBQNTRVAJAKQDAQUMdGhpc0Vwb2NoUmVmBQNTRVAFDGJsb2NrSGFzaEhleAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBGpvaW4BEHJld2FyZEFkZHJlc3NIZXgKAR1lbnN1cmVOb3RPdmVycmlkZU90aGVyTWluZXJQawEMZWxBZGRyZXNzSGV4BAckbWF0Y2gwCQChCAEJAQptaW5lclBrS2V5AQUMZWxBZGRyZXNzSGV4AwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIFAnBrCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBCQCsAgIJAKwCAgkArAICAhFFTCBtaW5lciBhZGRyZXNzIAUMZWxBZGRyZXNzSGV4AhggaXMgYWxyZWFkeSBsaW5rZWQgd2l0aCAJANgEAQUCcGsFBHVuaXQEBXBhcnRzCQC1CQIFEHJld2FyZEFkZHJlc3NIZXgCAjB4BA1yZXdhcmRBZGRyZXNzCQDdBAEJAJEDAgUFcGFydHMJAGUCCQCQAwEFBXBhcnRzAAEDCQEBIQEJAQ9pc0NvbnRyYWN0U2V0dXAACQACAQIfVGhlIGNvbnRyYWN0IGhhcyBub3QgeWV0IHNldCB1cAMJAGYCBQtNSU5fQkFMQU5DRQgJAO8HAQgFAWkMb3JpZ2luQ2FsbGVyCmdlbmVyYXRpbmcJAAIBCQCsAgIJAKwCAgkArAICAiFJbnN1ZmZpY2llbnQgZ2VuZXJhdGluZyBiYWxhbmNlOiAJAKQDAQgJAO8HAQgFAWkMb3JpZ2luQ2FsbGVyCmdlbmVyYXRpbmcCDC4gUmVxdWlyZWQ6IAkApAMBBQtNSU5fQkFMQU5DRQMJAQIhPQIJAMgBAQUNcmV3YXJkQWRkcmVzcwAUCQACAQIlcmV3YXJkQWRkcmVzcyBzaG91bGQgYmUgYW4gTDIgYWRkcmVzcwMJAGcCCQCQAwEFCWFsbE1pbmVycwAyCQACAQIPdG9vIG1hbnkgbWluZXJzCgEOY2hlY2tFeGlzdGVuY2UCBmV4aXN0cwVtaW5lcgMFBmV4aXN0cwYJAAACBQVtaW5lcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEDWFscmVhZHlFeGlzdHMKAAIkbAUJYWxsTWluZXJzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDmNoZWNrRXhpc3RlbmNlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIDBQ1hbHJlYWR5RXhpc3RzBQNuaWwECG5ld01pbmVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQWbG93ZXJjYXNlUmV3YXJkQWRkcmVzcwkA3AQBBQ1yZXdhcmRBZGRyZXNzBAVjaGVjawkBHWVuc3VyZU5vdE92ZXJyaWRlT3RoZXJNaW5lclBrAQUWbG93ZXJjYXNlUmV3YXJkQWRkcmVzcwMJAAACBQVjaGVjawUFY2hlY2sECW5ld01pbmVycwMJAAACCQCQAwEFCWFsbE1pbmVycwAABQhuZXdNaW5lcgkArAICCQCsAgIFDGFsbE1pbmVyc1N0cgUDU0VQBQhuZXdNaW5lcgQZZGVsZXRlUHJldlJld2FyZEFkZHJlc3NQawQHJG1hdGNoMAkAoggBCQEVbWluZXJSZXdhcmRBZGRyZXNzS2V5AQUIbmV3TWluZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAtwcmV2QWRkcmVzcwUHJG1hdGNoMAMJAAACBQtwcmV2QWRkcmVzcwkA3AQBBQ1yZXdhcmRBZGRyZXNzBQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCm1pbmVyUGtLZXkBBQtwcmV2QWRkcmVzcwUDbmlsBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQxhbGxNaW5lcnNLZXkFCW5ld01pbmVycwkAzAgCCQELU3RyaW5nRW50cnkCCQEVbWluZXJSZXdhcmRBZGRyZXNzS2V5AQUIbmV3TWluZXIJAKwCAgICMHgFFmxvd2VyY2FzZVJld2FyZEFkZHJlc3MJAMwIAgkBC0JpbmFyeUVudHJ5AgkBCm1pbmVyUGtLZXkBBRZsb3dlcmNhc2VSZXdhcmRBZGRyZXNzCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkFA25pbAUZZGVsZXRlUHJldlJld2FyZEFkZHJlc3NQawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVsZWF2ZQAEDGxlYXZpbmdNaW5lcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIKARBza2lwTGVhdmluZ01pbmVyAgNhY2MFbWluZXIDCQAAAgUFbWluZXIFDGxlYXZpbmdNaW5lcgUDYWNjCQDNCAIFA2FjYwUFbWluZXIED3JlbWFpbmluZ01pbmVycwoAAiRsBQlhbGxNaW5lcnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEHNraXBMZWF2aW5nTWluZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgQNcmV3YXJkQWRkcktleQkBFW1pbmVyUmV3YXJkQWRkcmVzc0tleQEFDGxlYXZpbmdNaW5lcgQRcHJldlJld2FyZEFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ1yZXdhcmRBZGRyS2V5AhZtaW5lciBoYXMgbmV2ZXIgam9pbmVkAwkAAAIFEXByZXZSZXdhcmRBZGRyZXNzBRFwcmV2UmV3YXJkQWRkcmVzcwMJAAACBQ50aGlzRXBvY2hNaW5lcggFAWkMb3JpZ2luQ2FsbGVyCQACAQIcZGVzaWduYXRlZCBtaW5lciBjYW4ndCBsZWF2ZQkAzAgCCQELU3RyaW5nRW50cnkCBQxhbGxNaW5lcnNLZXkJALoJAgUPcmVtYWluaW5nTWluZXJzBQNTRVAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh0cmFuc2ZlcgEQZGVzdEVsQWRkcmVzc0hleAQMY2hlY2tBZGRyZXNzAwkAAAIJALECAQUQZGVzdEVsQWRkcmVzc0hleAUURVRIX0FERFJFU1NfU1RSX1NJWkUJAN0EAQUQZGVzdEVsQWRkcmVzc0hleAkAAgEJAKwCAgkArAICCQCsAgICFEFkZHJlc3Mgc2hvdWxkIGhhdmUgCQCkAwEFFEVUSF9BRERSRVNTX1NUUl9TSVpFAhEgY2hhcmFjdGVycywgZ290IAkApAMBCQCxAgEFEGRlc3RFbEFkZHJlc3NIZXgDCQAAAgUMY2hlY2tBZGRyZXNzBQxjaGVja0FkZHJlc3MEDGNoZWNrUGF5bWVudAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQACAQkArAICAi9FeHBlY3RlZCBvbmUgcGF5bWVudCBhcyBhIHRyYW5zZmVyIGFtb3VudCwgZ290IAkApAMBCQCQAwEIBQFpCHBheW1lbnRzAwkAAAIFDGNoZWNrUGF5bWVudAUMY2hlY2tQYXltZW50BAp0b2tlbklkU3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBBQp0b2tlbklkS2V5BAd0b2tlbklkCQDZBAEFCnRva2VuSWRTdHIEAXQJAJEDAggFAWkIcGF5bWVudHMAAAQMY2hlY2tBc3NldElkBAckbWF0Y2gwCAUBdAdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEB2Fzc2V0SWQFByRtYXRjaDADCQAAAgUHYXNzZXRJZAUHdG9rZW5JZAYJAAIBCQCsAgIJAKwCAgkArAICAglFeHBlY3RlZCAFCnRva2VuSWRTdHICFSBpbiB0aGUgcGF5bWVudCwgZ290IAkA2AQBBQdhc3NldElkCQACAQkArAICCQCsAgICCUV4cGVjdGVkIAUKdG9rZW5JZFN0cgIaIGluIHRoZSBwYXltZW50LCBnb3QgV2F2ZXMDCQAAAgUMY2hlY2tBc3NldElkBQxjaGVja0Fzc2V0SWQECWxhc3RJbmRleAgJAQlibG9ja01ldGEBBRJtYWluQ2hhaW5MYXN0QmxvY2sCXzYECXF1ZXVlU2l6ZQkAZQIFFG5hdGl2ZVRyYW5zZmVyc0NvdW50BQlsYXN0SW5kZXgED2NoZWNrUXVldWVMaW1pdAMJAGYCAKABBQlxdWV1ZVNpemUJAQphbW91bnRHdEVxAwUBdADAhD0FCXF1ZXVlU2l6ZQMJAGYCAMAMBQlxdWV1ZVNpemUJAQphbW91bnRHdEVxAwUBdACAreIEBQlxdWV1ZVNpemUDCQBmAgCAGQUJcXVldWVTaXplCQEKYW1vdW50R3RFcQMFAXQAgMLXLwUJcXVldWVTaXplAwkAZgIAgDIFCXF1ZXVlU2l6ZQkBCmFtb3VudEd0RXEDBQF0AICU69wDBQlxdWV1ZVNpemUJAAIBCQCsAgIJAKwCAgIjVHJhbnNmZXJzIGRlbmllZCBmb3IgcXVldWUgc2l6ZSBvZiAJAKQDAQUJcXVldWVTaXplAiguIFdhaXQgdW50aWwgY3VycmVudCB0cmFuc2ZlcnMgcHJvY2Vzc2VkAwkAAAIFD2NoZWNrUXVldWVMaW1pdAUPY2hlY2tRdWV1ZUxpbWl0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRduYXRpdmVUcmFuc2ZlcnNDb3VudEtleQkAZAIFFG5hdGl2ZVRyYW5zZmVyc0NvdW50AAEJAMwIAgkBFW1rTmF0aXZlVHJhbnNmZXJFbnRyeQMFFG5hdGl2ZVRyYW5zZmVyc0NvdW50BRBkZXN0RWxBZGRyZXNzSGV4CAUBdAZhbW91bnQJAMwIAgkBBEJ1cm4CBQd0b2tlbklkCAUBdAZhbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwQMYmxvY2tIYXNoSGV4C21lcmtsZVByb29mFHRyYW5zZmVySW5kZXhJbkJsb2NrBmFtb3VudAQRd2l0aGRyYXdCbG9ja01ldGEJAQlibG9ja01ldGEBBQxibG9ja0hhc2hIZXgEE3dpdGhkcmF3QmxvY2tIZWlnaHQIBRF3aXRoZHJhd0Jsb2NrTWV0YQJfMQQUZmluYWxpemVkQmxvY2tIZWlnaHQICQEJYmxvY2tNZXRhAQkBEUBleHRyTmF0aXZlKDEwNTgpAQURZmluYWxpemVkQmxvY2tLZXkCXzEEGG1haW5DaGFpbkxhc3RCbG9ja0hlaWdodAgJAQlibG9ja01ldGEBBRJtYWluQ2hhaW5MYXN0QmxvY2sCXzEDCQBmAgUTd2l0aGRyYXdCbG9ja0hlaWdodAUUZmluYWxpemVkQmxvY2tIZWlnaHQJAAIBCQCsAgIJAKwCAgkArAICAgpFTCBibG9jayAjCQCkAwEFE3dpdGhkcmF3QmxvY2tIZWlnaHQCLSBpcyBub3QgZmluYWxpemVkLiBUaGUgY3VycmVudCBmaW5hbGl6ZWQgaXMgIwkApAMBBRRmaW5hbGl6ZWRCbG9ja0hlaWdodAMJAQIhPQIJAJADAQULbWVya2xlUHJvb2YFFFdJVEhEUkFXX1BST09GU19TSVpFCQACAQkArAICCQCsAgIJAKwCAgIJRXhwZWN0ZWQgCQCkAwEFFFdJVEhEUkFXX1BST09GU19TSVpFAg0gcHJvb2ZzLCBnb3QgCQCkAwEJAJADAQULbWVya2xlUHJvb2YDCQBmAgAABRR0cmFuc2ZlckluZGV4SW5CbG9jawkAAgEJAKwCAgIzVHJhbnNmZXIgaW5kZXggaW4gYmxvY2sgc2hvdWxkIGJlIG5vbm5lZ2F0aXZlLCBnb3QgCQCkAwEFFHRyYW5zZmVySW5kZXhJbkJsb2NrAwkAZwIAAAUGYW1vdW50CQACAQkArAICAh9BbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlLCBnb3QgCQCkAwEFBmFtb3VudAQUd2l0aGRyYXdCbG9ja0NoYWluSWQIBRF3aXRoZHJhd0Jsb2NrTWV0YQJfNAQLaXNNYWluQ2hhaW4JAAACBRR3aXRoZHJhd0Jsb2NrQ2hhaW5JZAULbWFpbkNoYWluSWQEEnJlbGF0ZXNUb01haW5DaGFpbgQHJG1hdGNoMAkAnwgBCQEUY2hhaW5Gb3JrZWRIZWlnaHRLZXkBBRR3aXRoZHJhd0Jsb2NrQ2hhaW5JZAMJAAECBQckbWF0Y2gwAgNJbnQEDGZvcmtlZEhlaWdodAUHJG1hdGNoMAkAZgIFDGZvcmtlZEhlaWdodAUTd2l0aGRyYXdCbG9ja0hlaWdodAkAAgEJAKwCAgkArAICCQCsAgIFDGJsb2NrSGFzaEhleAIdIGlzIG9uIGFuIGFsdGVybmF0aXZlIGNoYWluICMJAKQDAQUUd2l0aGRyYXdCbG9ja0NoYWluSWQCOCB0aGF0IHdhcyBub3QgYXBwcm92ZWQgYnkgbWFqb3JpdHkuIFdhaXQgZm9yIHNvbWUgYmxvY2tzAwMFC2lzTWFpbkNoYWluBgUScmVsYXRlc1RvTWFpbkNoYWluBAlyZWNpcGllbnQIBQFpDG9yaWdpbkNhbGxlcgQPcmVjaXBpZW50UGtIYXNoCQDJAQIJAMoBAggFCXJlY2lwaWVudAVieXRlcwACBRRQVUJMSUNfS0VZX0hBU0hfU0laRQQPemVyb0Ftb3VudEJ5dGVzASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQLYW1vdW50Qnl0ZXMJAJoDAQUGYW1vdW50BAtlbEV2ZW50RGF0YQkAywECCQDLAQIFD3JlY2lwaWVudFBrSGFzaAkAyQECBQ96ZXJvQW1vdW50Qnl0ZXMJAGUCCQDIAQEFD3plcm9BbW91bnRCeXRlcwkAyAEBBQthbW91bnRCeXRlcwULYW1vdW50Qnl0ZXMEEWVsRXZlbnREYXRhRGlnZXN0CQDwFQEFC2VsRXZlbnREYXRhBBJjYWxjdWxhdGVkUm9vdEhhc2gJAL0FAwULbWVya2xlUHJvb2YFEWVsRXZlbnREYXRhRGlnZXN0BRR0cmFuc2ZlckluZGV4SW5CbG9jawQQZXhwZWN0ZWRSb290SGFzaAgFEXdpdGhkcmF3QmxvY2tNZXRhAl81AwkAAAIFEmNhbGN1bGF0ZWRSb290SGFzaAUQZXhwZWN0ZWRSb290SGFzaAQHdG9rZW5JZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1OCkBBQp0b2tlbklkS2V5BAx0cmFuc2ZlcnNLZXkJARRibG9ja0UyQ1RyYW5zZmVyc0tleQEFDGJsb2NrSGFzaEhleAkAzAgCCQEHUmVpc3N1ZQMFB3Rva2VuSWQFBmFtb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUJcmVjaXBpZW50BQZhbW91bnQFB3Rva2VuSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUMdHJhbnNmZXJzS2V5CQEJc2V0T3JGYWlsAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQx0cmFuc2ZlcnNLZXkCAAUUdHJhbnNmZXJJbmRleEluQmxvY2sFA25pbAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICFEV4cGVjdGVkIHJvb3QgaGFzaDogCQDcBAEFEGV4cGVjdGVkUm9vdEhhc2gCBywgZ290OiAJANwEAQUSY2FsY3VsYXRlZFJvb3RIYXNoAhUuIEV2ZW50IGRhdGEgZGlnZXN0OiAJANoEAQURZWxFdmVudERhdGFEaWdlc3QCHy4gQ2hlY2sgeW91ciB3aXRoZHJhdyBhcmd1bWVudHMJAAIBCQCsAgIJAKwCAgIJRXhwZWN0ZWQgBQxibG9ja0hhc2hIZXgCLyB0byBiZSBlaXRoZXIgb24gdGhlIG1haW4gY2hhaW4gb3IgcmVsYXRlIHRvIGl0AWkBBXNldHVwAhNnZW5lc2lzQmxvY2tIYXNoSGV4EW1pbmVyUmV3YXJkSW5Hd2VpAwkBD2lzQ29udHJhY3RTZXR1cAAJAAIBAiRUaGUgY29udHJhY3QgaGFzIGJlZW4gYWxyZWFkeSBzZXQgdXADCQBmAgAABRFtaW5lclJld2FyZEluR3dlaQkAAgECJFRoZSBtaW5lciByZXdhcmQgbXVzdCBiZSBub25uZWdhdGl2ZQQQZ2VuZXNpc0Jsb2NrSGFzaAkA3QQBBRNnZW5lc2lzQmxvY2tIYXNoSGV4BBljaGVja0dlbmVzaXNCbG9ja0hhc2hTaXplAwkAAAIJAMgBAQUQZ2VuZXNpc0Jsb2NrSGFzaAUPQkxPQ0tfSEFTSF9TSVpFBgkAAgECGFdyb25nIGdlbmVzaXMgYmxvY2sgaGFzaAMJAAACBRljaGVja0dlbmVzaXNCbG9ja0hhc2hTaXplBRljaGVja0dlbmVzaXNCbG9ja0hhc2hTaXplBAdlbXB0eVBrASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQTZ2VuZXNpc01pbmVyQWRkcmVzcwkApwgBBQdlbXB0eVBrBBdnZW5lc2lzRXRoUmV3YXJkQWRkcmVzcwEUAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWdlbmVzaXNCbG9ja1JlZmVyZW5jZUhhc2gCQDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEBWlzc3VlCQDCCAUCBVVOSVQwAgxOYXRpdmUgdG9rZW4AAAAIBgQHdG9rZW5JZAkAuAgBBQVpc3N1ZQQQZ2VuZXNpc0Jsb2NrTWV0YQkBEG1rQmxvY2tNZXRhRW50cnkGBRNnZW5lc2lzQmxvY2tIYXNoSGV4AAAFGWdlbmVzaXNCbG9ja1JlZmVyZW5jZUhhc2gAAAkA3AQBAQAA////////////AQkAzAgCBRBnZW5lc2lzQmxvY2tNZXRhCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRjaGFpbkZpcnN0QmxvY2tJZEtleQEAAAUTZ2VuZXNpc0Jsb2NrSGFzaEhleAkAzAgCCQEQbWtDaGFpbk1ldGFFbnRyeQMAAAAABRNnZW5lc2lzQmxvY2tIYXNoSGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5taW5lclJld2FyZEtleQURbWluZXJSZXdhcmRJbkd3ZWkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGVwb2NoTWV0YUtleQEFBmhlaWdodAkArAICCQCsAgIJAKUIAQUTZ2VuZXNpc01pbmVyQWRkcmVzcwIDLDAsBRNnZW5lc2lzQmxvY2tIYXNoSGV4CQDMCAIJAQtTdHJpbmdFbnRyeQIFEWZpbmFsaXplZEJsb2NrS2V5BRNnZW5lc2lzQmxvY2tIYXNoSGV4CQDMCAIFBWlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIFCnRva2VuSWRLZXkJANgEAQUHdG9rZW5JZAkAzAgCCQELU3RyaW5nRW50cnkCBRJlbEJyaWRnZUFkZHJlc3NLZXkCKjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmE3ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAHbUgso=", "height": 3290416, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EkY5moE8FCU9CuGsFaX4Eaum76PqX5UM78oNkni7ezPh Next: 3RcHvbUrvhacUkEbDF6sAbEsJWivQptXXP9H9oenS514 Diff:
Old | New | Differences | |
---|---|---|---|
715 | 715 | ||
716 | 716 | ||
717 | 717 | @Callable(w) | |
718 | - | func join ( | |
719 | - | func | |
720 | - | let y = getBinary(M( | |
718 | + | func join (dr) = { | |
719 | + | func ds (dt) = { | |
720 | + | let y = getBinary(M(dt)) | |
721 | 721 | if ($isInstanceOf(y, "ByteVector")) | |
722 | 722 | then { | |
723 | - | let | |
724 | - | if (( | |
723 | + | let du = y | |
724 | + | if ((du == w.originCallerPublicKey)) | |
725 | 725 | then unit | |
726 | - | else throw(((("EL miner address " + | |
726 | + | else throw(((("EL miner address " + dt) + " is already linked with ") + toBase58String(du))) | |
727 | 727 | } | |
728 | 728 | else unit | |
729 | 729 | } | |
730 | 730 | ||
731 | + | let dv = split(dr, "0x") | |
732 | + | let N = fromBase16String(dv[(size(dv) - 1)]) | |
731 | 733 | if (!(cb())) | |
732 | 734 | then throw("The contract has not yet set up") | |
733 | 735 | else if ((c > wavesBalance(w.originCaller).generating)) | |
737 | 739 | else if ((size(ax) >= 50)) | |
738 | 740 | then throw("too many miners") | |
739 | 741 | else { | |
740 | - | func | |
742 | + | func dw (dx,H) = if (dx) | |
741 | 743 | then true | |
742 | 744 | else (H == toString(w.originCaller)) | |
743 | 745 | ||
744 | - | let | |
746 | + | let dy = { | |
745 | 747 | let bi = ax | |
746 | 748 | let bj = size(bi) | |
747 | 749 | let bk = false | |
748 | 750 | func bl (bm,bn) = if ((bn >= bj)) | |
749 | 751 | then bm | |
750 | - | else | |
752 | + | else dw(bm, bi[bn]) | |
751 | 753 | ||
752 | 754 | func bo (bm,bn) = if ((bn >= bj)) | |
753 | 755 | then bm | |
755 | 757 | ||
756 | 758 | bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
757 | 759 | } | |
758 | - | if ( | |
760 | + | if (dy) | |
759 | 761 | then nil | |
760 | 762 | else { | |
761 | - | let | |
762 | - | let | |
763 | - | let | |
764 | - | if (( | |
763 | + | let dz = toString(w.originCaller) | |
764 | + | let dA = toBase16String(N) | |
765 | + | let dB = ds(dA) | |
766 | + | if ((dB == dB)) | |
765 | 767 | then { | |
766 | 768 | let bL = if ((size(ax) == 0)) | |
767 | - | then | |
768 | - | else ((aw + d) + | |
769 | - | let | |
770 | - | let y = getString(K( | |
769 | + | then dz | |
770 | + | else ((aw + d) + dz) | |
771 | + | let dC = { | |
772 | + | let y = getString(K(dz)) | |
771 | 773 | if ($isInstanceOf(y, "String")) | |
772 | 774 | then { | |
773 | - | let | |
774 | - | if (( | |
775 | + | let dD = y | |
776 | + | if ((dD == toBase16String(N))) | |
775 | 777 | then nil | |
776 | - | else [DeleteEntry(M( | |
778 | + | else [DeleteEntry(M(dD))] | |
777 | 779 | } | |
778 | 780 | else nil | |
779 | 781 | } | |
780 | - | ([StringEntry(l, bL), StringEntry(K( | |
782 | + | ([StringEntry(l, bL), StringEntry(K(dz), ("0x" + dA)), BinaryEntry(M(dA), w.originCallerPublicKey)] ++ dC) | |
781 | 783 | } | |
782 | 784 | else throw("Strict value is not equal to itself.") | |
783 | 785 | } | |
788 | 790 | ||
789 | 791 | @Callable(w) | |
790 | 792 | func leave () = { | |
791 | - | let | |
792 | - | func | |
793 | + | let dE = toString(w.originCaller) | |
794 | + | func dF (bS,H) = if ((H == dE)) | |
793 | 795 | then bS | |
794 | 796 | else (bS :+ H) | |
795 | 797 | ||
796 | - | let | |
798 | + | let dG = { | |
797 | 799 | let bi = ax | |
798 | 800 | let bj = size(bi) | |
799 | 801 | let bk = nil | |
800 | 802 | func bl (bm,bn) = if ((bn >= bj)) | |
801 | 803 | then bm | |
802 | - | else | |
804 | + | else dF(bm, bi[bn]) | |
803 | 805 | ||
804 | 806 | func bo (bm,bn) = if ((bn >= bj)) | |
805 | 807 | then bm | |
807 | 809 | ||
808 | 810 | bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
809 | 811 | } | |
810 | - | let | |
811 | - | let | |
812 | - | if (( | |
812 | + | let dH = K(dE) | |
813 | + | let dI = valueOrErrorMessage(getString(this, dH), "miner has never joined") | |
814 | + | if ((dI == dI)) | |
813 | 815 | then if ((au == w.originCaller)) | |
814 | 816 | then throw("designated miner can't leave") | |
815 | - | else [StringEntry(l, makeString_2C( | |
817 | + | else [StringEntry(l, makeString_2C(dG, d))] | |
816 | 818 | else throw("Strict value is not equal to itself.") | |
817 | 819 | } | |
818 | 820 | ||
820 | 822 | ||
821 | 823 | @Callable(w) | |
822 | 824 | func transfer (T) = { | |
823 | - | let | |
825 | + | let dJ = if ((size(T) == i)) | |
824 | 826 | then fromBase16String(T) | |
825 | 827 | else throw(((("Address should have " + toString(i)) + " characters, got ") + toString(size(T)))) | |
826 | - | if (( | |
828 | + | if ((dJ == dJ)) | |
827 | 829 | then { | |
828 | - | let | |
830 | + | let dK = if ((size(w.payments) == 1)) | |
829 | 831 | then true | |
830 | 832 | else throw(("Expected one payment as a transfer amount, got " + toString(size(w.payments)))) | |
831 | - | if (( | |
833 | + | if ((dK == dK)) | |
832 | 834 | then { | |
833 | - | let | |
834 | - | let | |
835 | + | let dL = getStringValue(s) | |
836 | + | let dM = fromBase58String(dL) | |
835 | 837 | let ad = w.payments[0] | |
836 | - | let | |
838 | + | let dN = { | |
837 | 839 | let y = ad.assetId | |
838 | 840 | if ($isInstanceOf(y, "ByteVector")) | |
839 | 841 | then { | |
840 | - | let | |
841 | - | if (( | |
842 | + | let dO = y | |
843 | + | if ((dO == dM)) | |
842 | 844 | then true | |
843 | - | else throw(((("Expected " + | |
845 | + | else throw(((("Expected " + dL) + " in the payment, got ") + toBase58String(dO))) | |
844 | 846 | } | |
845 | - | else throw((("Expected " + | |
847 | + | else throw((("Expected " + dL) + " in the payment, got Waves")) | |
846 | 848 | } | |
847 | - | if (( | |
849 | + | if ((dN == dN)) | |
848 | 850 | then { | |
849 | - | let | |
850 | - | let af = (P - | |
851 | - | let | |
851 | + | let dP = az(ap)._6 | |
852 | + | let af = (P - dP) | |
853 | + | let dQ = if ((160 > af)) | |
852 | 854 | then ac(ad, 1000000, af) | |
853 | 855 | else if ((1600 > af)) | |
854 | 856 | then ac(ad, 10000000, af) | |
857 | 859 | else if ((6400 > af)) | |
858 | 860 | then ac(ad, 1000000000, af) | |
859 | 861 | else throw((("Transfers denied for queue size of " + toString(af)) + ". Wait until current transfers processed")) | |
860 | - | if (( | |
861 | - | then [IntegerEntry(u, (P + 1)), S(P, T, ad.amount), Burn( | |
862 | + | if ((dQ == dQ)) | |
863 | + | then [IntegerEntry(u, (P + 1)), S(P, T, ad.amount), Burn(dM, ad.amount)] | |
862 | 864 | else throw("Strict value is not equal to itself.") | |
863 | 865 | } | |
864 | 866 | else throw("Strict value is not equal to itself.") | |
871 | 873 | ||
872 | 874 | ||
873 | 875 | @Callable(w) | |
874 | - | func withdraw (A, | |
875 | - | let | |
876 | - | let | |
877 | - | let | |
878 | - | let | |
879 | - | if (( | |
880 | - | then throw(((("EL block #" + toString( | |
881 | - | else if ((size( | |
882 | - | then throw(((("Expected " + toString(h)) + " proofs, got ") + toString(size( | |
883 | - | else if ((0 > | |
884 | - | then throw(("Transfer index in block should be nonnegative, got " + toString( | |
876 | + | func withdraw (A,dR,dS,U) = { | |
877 | + | let dT = az(A) | |
878 | + | let dU = dT._1 | |
879 | + | let dV = az(getStringValue(r))._1 | |
880 | + | let dW = az(ap)._1 | |
881 | + | if ((dU > dV)) | |
882 | + | then throw(((("EL block #" + toString(dU)) + " is not finalized. The current finalized is #") + toString(dV))) | |
883 | + | else if ((size(dR) != h)) | |
884 | + | then throw(((("Expected " + toString(h)) + " proofs, got ") + toString(size(dR)))) | |
885 | + | else if ((0 > dS)) | |
886 | + | then throw(("Transfer index in block should be nonnegative, got " + toString(dS))) | |
885 | 887 | else if ((0 >= U)) | |
886 | 888 | then throw(("Amount should be positive, got " + toString(U))) | |
887 | 889 | else { | |
888 | - | let | |
889 | - | let | |
890 | - | let | |
891 | - | let y = getInteger(I( | |
890 | + | let dX = dT._4 | |
891 | + | let dY = (dX == am) | |
892 | + | let dZ = { | |
893 | + | let y = getInteger(I(dX)) | |
892 | 894 | if ($isInstanceOf(y, "Int")) | |
893 | 895 | then { | |
894 | - | let | |
895 | - | ( | |
896 | + | let ea = y | |
897 | + | (ea > dU) | |
896 | 898 | } | |
897 | - | else throw((((A + " is on an alternative chain #") + toString( | |
899 | + | else throw((((A + " is on an alternative chain #") + toString(dX)) + " that was not approved by majority. Wait for some blocks")) | |
898 | 900 | } | |
899 | - | if (if ( | |
901 | + | if (if (dY) | |
900 | 902 | then true | |
901 | - | else | |
903 | + | else dZ) | |
902 | 904 | then { | |
903 | - | let | |
904 | - | let | |
905 | - | let | |
906 | - | let | |
907 | - | let | |
908 | - | let | |
909 | - | let | |
910 | - | let | |
911 | - | if (( | |
905 | + | let eb = w.originCaller | |
906 | + | let ec = take(drop(eb.bytes, 2), f) | |
907 | + | let ed = base58'11111111111111111111111111111111111111111111' | |
908 | + | let ee = toBytes(U) | |
909 | + | let ef = ((ec + take(ed, (size(ed) - size(ee)))) + ee) | |
910 | + | let eg = blake2b256_16Kb(ef) | |
911 | + | let eh = createMerkleRoot(dR, eg, dS) | |
912 | + | let ei = dT._5 | |
913 | + | if ((eh == ei)) | |
912 | 914 | then { | |
913 | - | let | |
914 | - | let | |
915 | - | [Reissue( | |
915 | + | let dM = fromBase58String(getStringValue(s)) | |
916 | + | let ej = z(A) | |
917 | + | [Reissue(dM, U, true), ScriptTransfer(eb, U, dM), StringEntry(ej, cz(valueOrElse(getString(ej), ""), dS))] | |
916 | 918 | } | |
917 | - | else throw((((((("Expected root hash: " + toBase16String( | |
919 | + | else throw((((((("Expected root hash: " + toBase16String(ei)) + ", got: ") + toBase16String(eh)) + ". Event data digest: ") + toBase64String(eg)) + ". Check your withdraw arguments")) | |
918 | 920 | } | |
919 | 921 | else throw((("Expected " + A) + " to be either on the main chain or relate to it")) | |
920 | 922 | } | |
923 | 925 | ||
924 | 926 | ||
925 | 927 | @Callable(w) | |
926 | - | func setup ( | |
928 | + | func setup (ek,el) = if (cb()) | |
927 | 929 | then throw("The contract has been already set up") | |
928 | - | else if ((0 > | |
930 | + | else if ((0 > el)) | |
929 | 931 | then throw("The miner reward must be nonnegative") | |
930 | 932 | else { | |
931 | - | let | |
932 | - | let | |
933 | + | let em = fromBase16String(ek) | |
934 | + | let en = if ((size(em) == e)) | |
933 | 935 | then true | |
934 | 936 | else throw("Wrong genesis block hash") | |
935 | - | if (( | |
937 | + | if ((en == en)) | |
936 | 938 | then { | |
937 | - | let | |
938 | - | let | |
939 | - | let | |
940 | - | let | |
941 | - | let | |
942 | - | let | |
943 | - | let | |
944 | - | [ | |
939 | + | let eo = base58'11111111111111111111111111111111' | |
940 | + | let ep = addressFromPublicKey(eo) | |
941 | + | let eq = base58'11111111111111111111' | |
942 | + | let er = "0000000000000000000000000000000000000000000000000000000000000000" | |
943 | + | let es = Issue("UNIT0", "Native token", 0, 8, true) | |
944 | + | let dM = calculateAssetId(es) | |
945 | + | let et = aK(ek, 0, er, 0, toBase16String(base58''), -1) | |
946 | + | [et, StringEntry(D(0), ek), ak(0, 0, ek), IntegerEntry(p, el), StringEntry(B(height), ((toString(ep) + ",0,") + ek)), StringEntry(r, ek), es, StringEntry(s, toBase58String(dM)), StringEntry(t, "0x0000000000000000000000000000000000006a7e")] | |
945 | 947 | } | |
946 | 948 | else throw("Strict value is not equal to itself.") | |
947 | 949 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 8 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = 9223372036854775807 | |
5 | 5 | ||
6 | 6 | let b = 100000000 | |
7 | 7 | ||
8 | 8 | let c = (20000 * b) | |
9 | 9 | ||
10 | 10 | let d = "," | |
11 | 11 | ||
12 | 12 | let e = 32 | |
13 | 13 | ||
14 | 14 | let f = 20 | |
15 | 15 | ||
16 | 16 | let g = 32 | |
17 | 17 | ||
18 | 18 | let h = 10 | |
19 | 19 | ||
20 | 20 | let i = 40 | |
21 | 21 | ||
22 | 22 | let j = 16 | |
23 | 23 | ||
24 | 24 | let k = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" | |
25 | 25 | ||
26 | 26 | let l = "allMiners" | |
27 | 27 | ||
28 | 28 | let m = "mainChainId" | |
29 | 29 | ||
30 | 30 | let n = "lastChainId" | |
31 | 31 | ||
32 | 32 | let o = "firstValidAltChainId" | |
33 | 33 | ||
34 | 34 | let p = "minerReward" | |
35 | 35 | ||
36 | 36 | let q = "block_0x" | |
37 | 37 | ||
38 | 38 | let r = "finalizedBlock" | |
39 | 39 | ||
40 | 40 | let s = "tokenId" | |
41 | 41 | ||
42 | 42 | let t = "elBridgeAddress" | |
43 | 43 | ||
44 | 44 | let u = "nativeTransfersCount" | |
45 | 45 | ||
46 | 46 | func v (w) = { | |
47 | 47 | let x = toString(w) | |
48 | 48 | let y = size(x) | |
49 | 49 | if ((1 == y)) | |
50 | 50 | then ("0000000" + x) | |
51 | 51 | else if ((2 == y)) | |
52 | 52 | then ("000000" + x) | |
53 | 53 | else if ((3 == y)) | |
54 | 54 | then ("00000" + x) | |
55 | 55 | else if ((4 == y)) | |
56 | 56 | then ("0000" + x) | |
57 | 57 | else if ((5 == y)) | |
58 | 58 | then ("000" + x) | |
59 | 59 | else if ((6 == y)) | |
60 | 60 | then ("00" + x) | |
61 | 61 | else if ((7 == y)) | |
62 | 62 | then ("0" + x) | |
63 | 63 | else x | |
64 | 64 | } | |
65 | 65 | ||
66 | 66 | ||
67 | 67 | func z (A) = ("elToClTransfers_0x" + A) | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func B (C) = ("epoch_" + v(C)) | |
71 | 71 | ||
72 | 72 | ||
73 | 73 | func D (E) = (("chain" + toString(E)) + "FirstBlock") | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | func F (E) = ("chain_" + v(E)) | |
77 | 77 | ||
78 | 78 | ||
79 | 79 | func G (E,H) = ((("chain_" + v(E)) + "_") + toString(H)) | |
80 | 80 | ||
81 | 81 | ||
82 | 82 | func I (E) = (("chain_" + v(E)) + "ForkedHeight") | |
83 | 83 | ||
84 | 84 | ||
85 | 85 | func J (E) = (("chain" + toString(E)) + "Supporters") | |
86 | 86 | ||
87 | 87 | ||
88 | 88 | func K (L) = (("miner_" + L) + "_RewardAddress") | |
89 | 89 | ||
90 | 90 | ||
91 | 91 | func M (N) = (("miner_0x" + N) + "_PK") | |
92 | 92 | ||
93 | 93 | ||
94 | 94 | func O (H) = (("miner_" + toString(H)) + "_ChainId") | |
95 | 95 | ||
96 | 96 | ||
97 | 97 | let P = valueOrElse(getInteger(this, u), 0) | |
98 | 98 | ||
99 | 99 | func Q (R) = ("nativeTransfer_" + toString(R)) | |
100 | 100 | ||
101 | 101 | ||
102 | 102 | func S (R,T,U) = StringEntry(Q(R), ((("0x" + T) + d) + toString(U))) | |
103 | 103 | ||
104 | 104 | ||
105 | 105 | func V (W,X,Y) = { | |
106 | 106 | let Z = if (Y) | |
107 | 107 | then (j - 1) | |
108 | 108 | else j | |
109 | 109 | let aa = (X - W) | |
110 | 110 | let ab = if ((aa > Z)) | |
111 | 111 | then throw(((("Allowed only " + toString(Z)) + " transfers, got ") + toString(aa))) | |
112 | 112 | else true | |
113 | 113 | if ((ab == ab)) | |
114 | 114 | then if ((X >= P)) | |
115 | 115 | then throw(((("Attempt to transfer #" + toString(X)) + ". Available transfers: ") + toString(P))) | |
116 | 116 | else true | |
117 | 117 | else throw("Strict value is not equal to itself.") | |
118 | 118 | } | |
119 | 119 | ||
120 | 120 | ||
121 | 121 | func ac (ad,ae,af) = if ((ad.amount >= ae)) | |
122 | 122 | then true | |
123 | 123 | else throw((((((("Transferring amount " + toString(ad.amount)) + " should be >= ") + toString(ae)) + " for queue size of ") + toString(af)) + ". Transfer more or wait")) | |
124 | 124 | ||
125 | 125 | ||
126 | 126 | func ag (ah) = wavesBalance(ah).generating | |
127 | 127 | ||
128 | 128 | ||
129 | 129 | func ai (E) = { | |
130 | 130 | let x = getStringValue(F(E)) | |
131 | 131 | let aj = split(x, d) | |
132 | 132 | $Tuple2(parseIntValue(aj[0]), aj[1]) | |
133 | 133 | } | |
134 | 134 | ||
135 | 135 | ||
136 | 136 | func ak (E,al,A) = StringEntry(F(E), ((toString(al) + d) + A)) | |
137 | 137 | ||
138 | 138 | ||
139 | 139 | let am = valueOrElse(getInteger(m), 0) | |
140 | 140 | ||
141 | 141 | let an = ai(am) | |
142 | 142 | ||
143 | 143 | let ao = an._1 | |
144 | 144 | ||
145 | 145 | let ap = an._2 | |
146 | 146 | ||
147 | 147 | func aq (C) = { | |
148 | 148 | let y = getString(B(C)) | |
149 | 149 | if ($isInstanceOf(y, "String")) | |
150 | 150 | then { | |
151 | 151 | let x = y | |
152 | 152 | let ar = split(x, d) | |
153 | 153 | $Tuple3(addressFromStringValue(ar[0]), parseIntValue(ar[1]), ar[2]) | |
154 | 154 | } | |
155 | 155 | else unit | |
156 | 156 | } | |
157 | 157 | ||
158 | 158 | ||
159 | 159 | let as = { | |
160 | 160 | let y = aq(height) | |
161 | 161 | if ($isInstanceOf(y, "(Address, Int, String)")) | |
162 | 162 | then { | |
163 | 163 | let at = y | |
164 | 164 | at | |
165 | 165 | } | |
166 | 166 | else $Tuple2(unit, 0) | |
167 | 167 | } | |
168 | 168 | ||
169 | 169 | let au = as._1 | |
170 | 170 | ||
171 | 171 | let av = as._2 | |
172 | 172 | ||
173 | 173 | let aw = valueOrElse(getString(l), "") | |
174 | 174 | ||
175 | 175 | let ax = { | |
176 | 176 | let y = aw | |
177 | 177 | if (("" == y)) | |
178 | 178 | then nil | |
179 | 179 | else if ($isInstanceOf(y, "String")) | |
180 | 180 | then { | |
181 | 181 | let ay = y | |
182 | 182 | split_4C(ay, d) | |
183 | 183 | } | |
184 | 184 | else throw("Match error") | |
185 | 185 | } | |
186 | 186 | ||
187 | 187 | func az (aA) = { | |
188 | 188 | let aB = getBinaryValue((q + aA)) | |
189 | 189 | let aC = size(aB) | |
190 | 190 | let aD = toInt(aB) | |
191 | 191 | let aE = toInt(aB, 8) | |
192 | 192 | let aF = take(drop(aB, 16), e) | |
193 | 193 | let E = toInt(aB, (16 + e)) | |
194 | 194 | let aG = (24 + e) | |
195 | 195 | let aH = (aC - aG) | |
196 | 196 | let aI = if ((aH >= g)) | |
197 | 197 | then take(drop(aB, aG), g) | |
198 | 198 | else base58'' | |
199 | 199 | let aJ = if (if ((aH == 8)) | |
200 | 200 | then true | |
201 | 201 | else (aH > g)) | |
202 | 202 | then toInt(aB, (aG + size(aI))) | |
203 | 203 | else -1 | |
204 | 204 | $Tuple6(aD, aE, aF, E, aI, aJ) | |
205 | 205 | } | |
206 | 206 | ||
207 | 207 | ||
208 | 208 | func aK (A,aD,aL,E,aM,aJ) = { | |
209 | 209 | let aN = fromBase16String(aM) | |
210 | 210 | let aO = size(aN) | |
211 | 211 | let aP = if (if ((aO == 0)) | |
212 | 212 | then true | |
213 | 213 | else (aO == g)) | |
214 | 214 | then true | |
215 | 215 | else throw(((("Transfers root hash should have 0 or " + toString(g)) + " bytes, got ") + toString(aO))) | |
216 | 216 | if ((aP == aP)) | |
217 | 217 | then { | |
218 | 218 | let aQ = (((((toBytes(aD) + toBytes(height)) + fromBase16String(aL)) + toBytes(E)) + aN) + toBytes(aJ)) | |
219 | 219 | BinaryEntry((q + A), aQ) | |
220 | 220 | } | |
221 | 221 | else throw("Strict value is not equal to itself.") | |
222 | 222 | } | |
223 | 223 | ||
224 | 224 | ||
225 | 225 | func aR (H,E) = { | |
226 | 226 | let y = getInteger(G(E, H)) | |
227 | 227 | if ($isInstanceOf(y, "Int")) | |
228 | 228 | then { | |
229 | 229 | let aS = y | |
230 | 230 | aS | |
231 | 231 | } | |
232 | 232 | else { | |
233 | 233 | let aT = getStringValue(((("chain" + toString(E)) + "LastMinedBy") + toString(H))) | |
234 | 234 | az(aT)._1 | |
235 | 235 | } | |
236 | 236 | } | |
237 | 237 | ||
238 | 238 | ||
239 | 239 | let aU = { | |
240 | 240 | let aV = { | |
241 | 241 | let y = lastBlock.vrf | |
242 | 242 | if ($isInstanceOf(y, "ByteVector")) | |
243 | 243 | then { | |
244 | 244 | let aW = y | |
245 | 245 | aW | |
246 | 246 | } | |
247 | 247 | else lastBlock.generationSignature | |
248 | 248 | } | |
249 | 249 | func aX (aY,H) = { | |
250 | 250 | let aZ = aY | |
251 | 251 | let ba = aZ._1 | |
252 | 252 | let bb = aZ._2 | |
253 | 253 | let bc = aZ._3 | |
254 | 254 | let bd = aZ._4 | |
255 | 255 | let be = addressFromStringValue(H) | |
256 | 256 | let bf = wavesBalance(be).generating | |
257 | 257 | let bg = ag(be) | |
258 | 258 | if (if ((c > bf)) | |
259 | 259 | then true | |
260 | 260 | else (0 >= bg)) | |
261 | 261 | then aY | |
262 | 262 | else { | |
263 | 263 | let bh = calculateDelay(be, bg) | |
264 | 264 | if ((bc > bh)) | |
265 | 265 | then $Tuple4(H, (bb + bg), bh, (bd :+ H)) | |
266 | 266 | else $Tuple4(ba, (bb + bg), bc, (bd :+ H)) | |
267 | 267 | } | |
268 | 268 | } | |
269 | 269 | ||
270 | 270 | let bi = ax | |
271 | 271 | let bj = size(bi) | |
272 | 272 | let bk = $Tuple4("", 0, a, nil) | |
273 | 273 | func bl (bm,bn) = if ((bn >= bj)) | |
274 | 274 | then bm | |
275 | 275 | else aX(bm, bi[bn]) | |
276 | 276 | ||
277 | 277 | func bo (bm,bn) = if ((bn >= bj)) | |
278 | 278 | then bm | |
279 | 279 | else throw("List size exceeds 50") | |
280 | 280 | ||
281 | 281 | bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
282 | 282 | } | |
283 | 283 | ||
284 | 284 | let bp = aU._1 | |
285 | 285 | ||
286 | 286 | let bq = aU._2 | |
287 | 287 | ||
288 | 288 | let br = az(ap) | |
289 | 289 | ||
290 | 290 | let bs = br._1 | |
291 | 291 | ||
292 | 292 | let bt = br._2 | |
293 | 293 | ||
294 | 294 | func bu (bv,bw,bx) = { | |
295 | 295 | let by = split_4C("::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", "") | |
296 | 296 | let bz = (bq / 2) | |
297 | 297 | func bA (aY,bB) = { | |
298 | 298 | let bC = aY | |
299 | 299 | let bD = bC._1 | |
300 | 300 | let bE = bC._2 | |
301 | 301 | let bF = bC._3 | |
302 | 302 | let bd = bC._4 | |
303 | 303 | let y = bE | |
304 | 304 | if ($isInstanceOf(y, "Unit")) | |
305 | 305 | then { | |
306 | 306 | let bG = if ((bD == height)) | |
307 | 307 | then $Tuple3(bv, bw, bx) | |
308 | 308 | else value(aq(bD)) | |
309 | 309 | let H = bG._1 | |
310 | 310 | let bH = bG._2 | |
311 | 311 | let bI = bG._3 | |
312 | 312 | if (if ((bH == 0)) | |
313 | 313 | then true | |
314 | 314 | else ((height - bD) >= 100)) | |
315 | 315 | then $Tuple4(bD, bI, bF, ax) | |
316 | 316 | else { | |
317 | 317 | let bJ = if (containsElement(bd, H)) | |
318 | 318 | then $Tuple2(bF, bd) | |
319 | 319 | else $Tuple2((bF + ag(H)), H :: bd) | |
320 | 320 | let bK = bJ._1 | |
321 | 321 | let bL = bJ._2 | |
322 | 322 | if ((bK > bz)) | |
323 | 323 | then $Tuple4(bD, bI, bK, ax) | |
324 | 324 | else $Tuple4(bH, unit, bK, bL) | |
325 | 325 | } | |
326 | 326 | } | |
327 | 327 | else aY | |
328 | 328 | } | |
329 | 329 | ||
330 | 330 | let bM = { | |
331 | 331 | let bi = by | |
332 | 332 | let bj = size(bi) | |
333 | 333 | let bk = $Tuple4(height, unit, 0, nil) | |
334 | 334 | func bl (bm,bn) = if ((bn >= bj)) | |
335 | 335 | then bm | |
336 | 336 | else bA(bm, bi[bn]) | |
337 | 337 | ||
338 | 338 | func bo (bm,bn) = if ((bn >= bj)) | |
339 | 339 | then bm | |
340 | 340 | else throw("List size exceeds 100") | |
341 | 341 | ||
342 | 342 | bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100) | |
343 | 343 | } | |
344 | 344 | let bN = bM._1 | |
345 | 345 | let bO = bM._2 | |
346 | 346 | let y = bO | |
347 | 347 | if ($isInstanceOf(y, "String")) | |
348 | 348 | then { | |
349 | 349 | let bP = y | |
350 | 350 | bP | |
351 | 351 | } | |
352 | 352 | else value(aq(bN))._3 | |
353 | 353 | } | |
354 | 354 | ||
355 | 355 | ||
356 | 356 | func bQ (E) = { | |
357 | 357 | func bR (bS,bT) = { | |
358 | 358 | let bU = bS | |
359 | 359 | let bF = bU._1 | |
360 | 360 | let bV = bU._2 | |
361 | 361 | let bW = addressFromStringValue(bT) | |
362 | 362 | if (containsElement(bV, bW)) | |
363 | 363 | then bS | |
364 | 364 | else { | |
365 | 365 | let bX = ag(bW) | |
366 | 366 | $Tuple2((bF + bX), (bV :+ bW)) | |
367 | 367 | } | |
368 | 368 | } | |
369 | 369 | ||
370 | 370 | let bY = split_4C(getStringValue(J(E)), d) | |
371 | 371 | let bZ = { | |
372 | 372 | let bi = bY | |
373 | 373 | let bj = size(bi) | |
374 | 374 | let bk = $Tuple2(0, nil) | |
375 | 375 | func bl (bm,bn) = if ((bn >= bj)) | |
376 | 376 | then bm | |
377 | 377 | else bR(bm, bi[bn]) | |
378 | 378 | ||
379 | 379 | func bo (bm,bn) = if ((bn >= bj)) | |
380 | 380 | then bm | |
381 | 381 | else throw("List size exceeds 100") | |
382 | 382 | ||
383 | 383 | bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100) | |
384 | 384 | } | |
385 | 385 | let bX = bZ._1 | |
386 | 386 | let ca = bZ._2 | |
387 | 387 | bX | |
388 | 388 | } | |
389 | 389 | ||
390 | 390 | ||
391 | 391 | func cb () = isDefined(getInteger(p)) | |
392 | 392 | ||
393 | 393 | ||
394 | 394 | func cc (bW) = if ((toString(bW) != bp)) | |
395 | 395 | then throw(((((toBase58String(bW.bytes) + " is not allowed to mine in ") + toString(height)) + " epoch. Expected ") + bp)) | |
396 | 396 | else unit | |
397 | 397 | ||
398 | 398 | ||
399 | 399 | func cd (ce,cf) = if ((ce == cf)) | |
400 | 400 | then unit | |
401 | 401 | else throw(((("Expected a reference to the chain last block: 0x" + cf) + ". Got: 0x") + ce)) | |
402 | 402 | ||
403 | 403 | ||
404 | 404 | func cg (E) = { | |
405 | 405 | let ch = getStringValue(D(E)) | |
406 | 406 | let ci = valueOrElse(getInteger(o), 0) | |
407 | 407 | if ((ci > E)) | |
408 | 408 | then true | |
409 | 409 | else (az(getStringValue(r))._1 > az(ch)._1) | |
410 | 410 | } | |
411 | 411 | ||
412 | 412 | ||
413 | 413 | func cj (H) = valueOrElse(getInteger(O(H)), getInteger(("chainIdOf" + toString(H)))) | |
414 | 414 | ||
415 | 415 | ||
416 | 416 | func ck (bW,cl,cm) = { | |
417 | 417 | let cn = { | |
418 | 418 | let y = cm | |
419 | 419 | if ($isInstanceOf(y, "String")) | |
420 | 420 | then { | |
421 | 421 | let aT = y | |
422 | 422 | let co = aR(bW, am) | |
423 | 423 | ((az(aT)._1 + 1) > co) | |
424 | 424 | } | |
425 | 425 | else true | |
426 | 426 | } | |
427 | 427 | let y = cj(bW) | |
428 | 428 | if ($isInstanceOf(y, "Int")) | |
429 | 429 | then { | |
430 | 430 | let cp = y | |
431 | 431 | if (if ((cp == cl)) | |
432 | 432 | then true | |
433 | 433 | else if (cg(cp)) | |
434 | 434 | then cn | |
435 | 435 | else false) | |
436 | 436 | then unit | |
437 | 437 | else throw(("miner is mining other chain " + toString(cp))) | |
438 | 438 | } | |
439 | 439 | else unit | |
440 | 440 | } | |
441 | 441 | ||
442 | 442 | ||
443 | 443 | let cq = (" at height " + toString(height)) | |
444 | 444 | ||
445 | 445 | func cr (cs) = valueOrErrorMessage(valueOrErrorMessage(blockInfoByHeight(cs), ("last block is not available" + cq)).vrf, ("VRF is not available" + cq)) | |
446 | 446 | ||
447 | 447 | ||
448 | 448 | func ct (cu) = { | |
449 | 449 | let cv = cr(height) | |
450 | 450 | if ((cu == cv)) | |
451 | 451 | then unit | |
452 | 452 | else throw((((("Expected VRF " + toBase58String(cu)) + " does not match actual ") + toBase58String(cv)) + cq)) | |
453 | 453 | } | |
454 | 454 | ||
455 | 455 | ||
456 | 456 | func cw (E,bW) = { | |
457 | 457 | let cx = getStringValue(J(E)) | |
458 | 458 | let cy = split_4C(cx, d) | |
459 | 459 | if (containsElement(cy, toString(bW))) | |
460 | 460 | then nil | |
461 | 461 | else [StringEntry(J(E), ((cx + d) + toString(bW)))] | |
462 | 462 | } | |
463 | 463 | ||
464 | 464 | ||
465 | 465 | func cz (cA,R) = if ((0 > R)) | |
466 | 466 | then throw(("Can't withdraw at negative index: " + toString(R))) | |
467 | 467 | else { | |
468 | 468 | let cB = size(cA) | |
469 | 469 | if ((R >= cB)) | |
470 | 470 | then { | |
471 | 471 | let cC = (R - cB) | |
472 | 472 | if ((cC > size(k))) | |
473 | 473 | then throw((("Can't add " + toString(cC)) + " empty flags. Contact with developers")) | |
474 | 474 | else ((cA + take(k, cC)) + "1") | |
475 | 475 | } | |
476 | 476 | else { | |
477 | 477 | let cD = drop(cA, R) | |
478 | 478 | let cE = take(cD, 1) | |
479 | 479 | if ((cE == "0")) | |
480 | 480 | then ((take(cA, R) + "1") + drop(cD, 1)) | |
481 | 481 | else throw((("Transfer #" + toString(R)) + " has been already taken")) | |
482 | 482 | } | |
483 | 483 | } | |
484 | 484 | ||
485 | 485 | ||
486 | 486 | func cF (cG) = { | |
487 | 487 | let cH = fromBase16String(cG) | |
488 | 488 | if ((size(cH) != e)) | |
489 | 489 | then throw("invalid block id length") | |
490 | 490 | else cG | |
491 | 491 | } | |
492 | 492 | ||
493 | 493 | ||
494 | 494 | func cI (cJ,cK,bH) = { | |
495 | 495 | let cL = az(getStringValue(r))._1 | |
496 | 496 | let cM = bu(cJ, bH, cK) | |
497 | 497 | if (if ((cM == cK)) | |
498 | 498 | then true | |
499 | 499 | else (az(cM)._1 > cL)) | |
500 | 500 | then [StringEntry(r, cM)] | |
501 | 501 | else nil | |
502 | 502 | } | |
503 | 503 | ||
504 | 504 | ||
505 | 505 | @Callable(w) | |
506 | 506 | func extendMainChain (A,cN,aW,aM,aJ) = { | |
507 | 507 | let cO = cF(A) | |
508 | 508 | if ((cO == cO)) | |
509 | 509 | then { | |
510 | 510 | let cP = ct(aW) | |
511 | 511 | if ((cP == cP)) | |
512 | 512 | then { | |
513 | 513 | let cQ = ck(w.originCaller, am, unit) | |
514 | 514 | if ((cQ == cQ)) | |
515 | 515 | then { | |
516 | 516 | let cR = cd(cN, ap) | |
517 | 517 | if ((cR == cR)) | |
518 | 518 | then { | |
519 | 519 | let cS = V(az(cN)._6, aJ, true) | |
520 | 520 | if ((cS == cS)) | |
521 | 521 | then { | |
522 | 522 | let cT = { | |
523 | 523 | let y = aq(height) | |
524 | 524 | if ($isInstanceOf(y, "Unit")) | |
525 | 525 | then StringEntry(B(height), ((((toString(w.originCaller) + d) + toString(bt)) + d) + A)) | |
526 | 526 | else { | |
527 | 527 | let cU = y | |
528 | 528 | throw("Epoch already started") | |
529 | 529 | } | |
530 | 530 | } | |
531 | 531 | if ((cT == cT)) | |
532 | 532 | then { | |
533 | 533 | let cV = cc(w.originCaller) | |
534 | 534 | if ((cV == cV)) | |
535 | 535 | then { | |
536 | 536 | let cW = cI(w.originCaller, A, bt) | |
537 | 537 | let al = (ao + 1) | |
538 | 538 | ([aK(A, al, ap, am, aM, aJ), ak(am, al, A), IntegerEntry(O(w.originCaller), am), IntegerEntry(G(am, w.originCaller), al), cT] ++ cW) | |
539 | 539 | } | |
540 | 540 | else throw("Strict value is not equal to itself.") | |
541 | 541 | } | |
542 | 542 | else throw("Strict value is not equal to itself.") | |
543 | 543 | } | |
544 | 544 | else throw("Strict value is not equal to itself.") | |
545 | 545 | } | |
546 | 546 | else throw("Strict value is not equal to itself.") | |
547 | 547 | } | |
548 | 548 | else throw("Strict value is not equal to itself.") | |
549 | 549 | } | |
550 | 550 | else throw("Strict value is not equal to itself.") | |
551 | 551 | } | |
552 | 552 | else throw("Strict value is not equal to itself.") | |
553 | 553 | } | |
554 | 554 | ||
555 | 555 | ||
556 | 556 | ||
557 | 557 | @Callable(w) | |
558 | 558 | func startAltChain (A,cN,aW,aM,aJ) = { | |
559 | 559 | let cO = cF(A) | |
560 | 560 | if ((cO == cO)) | |
561 | 561 | then { | |
562 | 562 | let cP = ct(aW) | |
563 | 563 | if ((cP == cP)) | |
564 | 564 | then { | |
565 | 565 | let cX = az(cN) | |
566 | 566 | let cY = cX._1 | |
567 | 567 | let cZ = cX._2 | |
568 | 568 | let da = cX._3 | |
569 | 569 | let db = cX._4 | |
570 | 570 | let dc = cX._5 | |
571 | 571 | let W = cX._6 | |
572 | 572 | let dd = az(getStringValue(r))._2 | |
573 | 573 | let de = if ((cZ >= dd)) | |
574 | 574 | then cZ | |
575 | 575 | else throw((((("Can not start alt chain from epoch " + toString(cZ)) + ", epoch ") + toString(dd)) + " is finalized")) | |
576 | 576 | let cQ = ck(w.originCaller, am, cN) | |
577 | 577 | if ((cQ == cQ)) | |
578 | 578 | then { | |
579 | 579 | let cS = V(W, aJ, true) | |
580 | 580 | if ((cS == cS)) | |
581 | 581 | then { | |
582 | 582 | let df = (valueOrElse(getInteger(n), 0) + 1) | |
583 | 583 | let al = (cY + 1) | |
584 | 584 | let cT = { | |
585 | 585 | let y = aq(height) | |
586 | 586 | if ($isInstanceOf(y, "Unit")) | |
587 | 587 | then StringEntry(B(height), ((((toString(w.originCaller) + d) + toString(de)) + d) + A)) | |
588 | 588 | else { | |
589 | 589 | let cU = y | |
590 | 590 | throw("Epoch already started") | |
591 | 591 | } | |
592 | 592 | } | |
593 | 593 | let cV = cc(w.originCaller) | |
594 | 594 | if ((cV == cV)) | |
595 | 595 | then [cT, aK(A, al, cN, df, aM, aJ), StringEntry(D(df), A), ak(df, al, A), IntegerEntry(O(w.originCaller), df), IntegerEntry(G(df, w.originCaller), al), IntegerEntry(G(am, w.originCaller), al), StringEntry(J(df), toString(w.originCaller)), IntegerEntry(n, df)] | |
596 | 596 | else throw("Strict value is not equal to itself.") | |
597 | 597 | } | |
598 | 598 | else throw("Strict value is not equal to itself.") | |
599 | 599 | } | |
600 | 600 | else throw("Strict value is not equal to itself.") | |
601 | 601 | } | |
602 | 602 | else throw("Strict value is not equal to itself.") | |
603 | 603 | } | |
604 | 604 | else throw("Strict value is not equal to itself.") | |
605 | 605 | } | |
606 | 606 | ||
607 | 607 | ||
608 | 608 | ||
609 | 609 | @Callable(w) | |
610 | 610 | func extendAltChain (A,cN,aW,E,aM,aJ) = { | |
611 | 611 | let cO = cF(A) | |
612 | 612 | if ((cO == cO)) | |
613 | 613 | then { | |
614 | 614 | let cP = ct(aW) | |
615 | 615 | if ((cP == cP)) | |
616 | 616 | then { | |
617 | 617 | let dg = az(getStringValue(D(E))) | |
618 | 618 | let cQ = ck(w.originCaller, E, toBase16String(dg._3)) | |
619 | 619 | if ((cQ == cQ)) | |
620 | 620 | then { | |
621 | 621 | let dh = ai(E) | |
622 | 622 | let di = dh._1 | |
623 | 623 | let dj = dh._2 | |
624 | 624 | let cR = cd(cN, dj) | |
625 | 625 | if ((cR == cR)) | |
626 | 626 | then { | |
627 | 627 | let cS = V(az(cN)._6, aJ, true) | |
628 | 628 | if ((cS == cS)) | |
629 | 629 | then { | |
630 | 630 | let al = (di + 1) | |
631 | 631 | let bH = az(cN)._2 | |
632 | 632 | let dk = if ((bQ(E) > (bq / 2))) | |
633 | 633 | then { | |
634 | 634 | let dl = valueOrElse(getInteger(n), 0) | |
635 | 635 | let cW = cI(w.originCaller, A, bH) | |
636 | 636 | ([IntegerEntry(I(am), dg._1), IntegerEntry(m, E), IntegerEntry(o, (dl + 1))] ++ cW) | |
637 | 637 | } | |
638 | 638 | else nil | |
639 | 639 | let cT = { | |
640 | 640 | let y = aq(height) | |
641 | 641 | if ($isInstanceOf(y, "Unit")) | |
642 | 642 | then StringEntry(B(height), ((((toString(w.originCaller) + d) + toString(bH)) + d) + A)) | |
643 | 643 | else { | |
644 | 644 | let cU = y | |
645 | 645 | throw("Epoch already started") | |
646 | 646 | } | |
647 | 647 | } | |
648 | 648 | if ((cT == cT)) | |
649 | 649 | then { | |
650 | 650 | let cV = cc(w.originCaller) | |
651 | 651 | if ((cV == cV)) | |
652 | 652 | then { | |
653 | 653 | let dm = if (if ((dk == nil)) | |
654 | 654 | then (valueOrElse(cj(w.originCaller), 0) != E) | |
655 | 655 | else false) | |
656 | 656 | then [IntegerEntry(G(am, w.originCaller), dg._1)] | |
657 | 657 | else nil | |
658 | 658 | ((([aK(A, al, cN, E, aM, aJ), ak(E, al, A), cT, IntegerEntry(O(w.originCaller), E), IntegerEntry(G(E, w.originCaller), al)] ++ dk) ++ cw(E, w.originCaller)) ++ dm) | |
659 | 659 | } | |
660 | 660 | else throw("Strict value is not equal to itself.") | |
661 | 661 | } | |
662 | 662 | else throw("Strict value is not equal to itself.") | |
663 | 663 | } | |
664 | 664 | else throw("Strict value is not equal to itself.") | |
665 | 665 | } | |
666 | 666 | else throw("Strict value is not equal to itself.") | |
667 | 667 | } | |
668 | 668 | else throw("Strict value is not equal to itself.") | |
669 | 669 | } | |
670 | 670 | else throw("Strict value is not equal to itself.") | |
671 | 671 | } | |
672 | 672 | else throw("Strict value is not equal to itself.") | |
673 | 673 | } | |
674 | 674 | ||
675 | 675 | ||
676 | 676 | ||
677 | 677 | @Callable(w) | |
678 | 678 | func appendBlock (A,cN,aM,aJ) = { | |
679 | 679 | let dn = if ((au == w.originCaller)) | |
680 | 680 | then true | |
681 | 681 | else { | |
682 | 682 | let y = au | |
683 | 683 | if ($isInstanceOf(y, "Address")) | |
684 | 684 | then { | |
685 | 685 | let do = y | |
686 | 686 | throw(("not allowed to forge blocks in this epoch, expected from " + toString(do))) | |
687 | 687 | } | |
688 | 688 | else throw("not allowed to forge blocks in this epoch, epoch miner is absent") | |
689 | 689 | } | |
690 | 690 | if ((dn == dn)) | |
691 | 691 | then { | |
692 | 692 | let E = valueOrElse(cj(w.originCaller), am) | |
693 | 693 | let dp = ai(E) | |
694 | 694 | let di = dp._1 | |
695 | 695 | let dq = dp._2 | |
696 | 696 | let cR = cd(cN, dq) | |
697 | 697 | if ((cR == cR)) | |
698 | 698 | then { | |
699 | 699 | let cS = V(az(cN)._6, aJ, false) | |
700 | 700 | if ((cS == cS)) | |
701 | 701 | then { | |
702 | 702 | let al = (di + 1) | |
703 | 703 | let cO = cF(A) | |
704 | 704 | if ((cO == cO)) | |
705 | 705 | then [aK(A, al, dq, E, aM, aJ), IntegerEntry(G(E, w.originCaller), al), ak(E, al, A), StringEntry(B(height), ((((toString(value(au)) + d) + toString(av)) + d) + A))] | |
706 | 706 | else throw("Strict value is not equal to itself.") | |
707 | 707 | } | |
708 | 708 | else throw("Strict value is not equal to itself.") | |
709 | 709 | } | |
710 | 710 | else throw("Strict value is not equal to itself.") | |
711 | 711 | } | |
712 | 712 | else throw("Strict value is not equal to itself.") | |
713 | 713 | } | |
714 | 714 | ||
715 | 715 | ||
716 | 716 | ||
717 | 717 | @Callable(w) | |
718 | - | func join ( | |
719 | - | func | |
720 | - | let y = getBinary(M( | |
718 | + | func join (dr) = { | |
719 | + | func ds (dt) = { | |
720 | + | let y = getBinary(M(dt)) | |
721 | 721 | if ($isInstanceOf(y, "ByteVector")) | |
722 | 722 | then { | |
723 | - | let | |
724 | - | if (( | |
723 | + | let du = y | |
724 | + | if ((du == w.originCallerPublicKey)) | |
725 | 725 | then unit | |
726 | - | else throw(((("EL miner address " + | |
726 | + | else throw(((("EL miner address " + dt) + " is already linked with ") + toBase58String(du))) | |
727 | 727 | } | |
728 | 728 | else unit | |
729 | 729 | } | |
730 | 730 | ||
731 | + | let dv = split(dr, "0x") | |
732 | + | let N = fromBase16String(dv[(size(dv) - 1)]) | |
731 | 733 | if (!(cb())) | |
732 | 734 | then throw("The contract has not yet set up") | |
733 | 735 | else if ((c > wavesBalance(w.originCaller).generating)) | |
734 | 736 | then throw(((("Insufficient generating balance: " + toString(wavesBalance(w.originCaller).generating)) + ". Required: ") + toString(c))) | |
735 | 737 | else if ((size(N) != 20)) | |
736 | 738 | then throw("rewardAddress should be an L2 address") | |
737 | 739 | else if ((size(ax) >= 50)) | |
738 | 740 | then throw("too many miners") | |
739 | 741 | else { | |
740 | - | func | |
742 | + | func dw (dx,H) = if (dx) | |
741 | 743 | then true | |
742 | 744 | else (H == toString(w.originCaller)) | |
743 | 745 | ||
744 | - | let | |
746 | + | let dy = { | |
745 | 747 | let bi = ax | |
746 | 748 | let bj = size(bi) | |
747 | 749 | let bk = false | |
748 | 750 | func bl (bm,bn) = if ((bn >= bj)) | |
749 | 751 | then bm | |
750 | - | else | |
752 | + | else dw(bm, bi[bn]) | |
751 | 753 | ||
752 | 754 | func bo (bm,bn) = if ((bn >= bj)) | |
753 | 755 | then bm | |
754 | 756 | else throw("List size exceeds 50") | |
755 | 757 | ||
756 | 758 | bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
757 | 759 | } | |
758 | - | if ( | |
760 | + | if (dy) | |
759 | 761 | then nil | |
760 | 762 | else { | |
761 | - | let | |
762 | - | let | |
763 | - | let | |
764 | - | if (( | |
763 | + | let dz = toString(w.originCaller) | |
764 | + | let dA = toBase16String(N) | |
765 | + | let dB = ds(dA) | |
766 | + | if ((dB == dB)) | |
765 | 767 | then { | |
766 | 768 | let bL = if ((size(ax) == 0)) | |
767 | - | then | |
768 | - | else ((aw + d) + | |
769 | - | let | |
770 | - | let y = getString(K( | |
769 | + | then dz | |
770 | + | else ((aw + d) + dz) | |
771 | + | let dC = { | |
772 | + | let y = getString(K(dz)) | |
771 | 773 | if ($isInstanceOf(y, "String")) | |
772 | 774 | then { | |
773 | - | let | |
774 | - | if (( | |
775 | + | let dD = y | |
776 | + | if ((dD == toBase16String(N))) | |
775 | 777 | then nil | |
776 | - | else [DeleteEntry(M( | |
778 | + | else [DeleteEntry(M(dD))] | |
777 | 779 | } | |
778 | 780 | else nil | |
779 | 781 | } | |
780 | - | ([StringEntry(l, bL), StringEntry(K( | |
782 | + | ([StringEntry(l, bL), StringEntry(K(dz), ("0x" + dA)), BinaryEntry(M(dA), w.originCallerPublicKey)] ++ dC) | |
781 | 783 | } | |
782 | 784 | else throw("Strict value is not equal to itself.") | |
783 | 785 | } | |
784 | 786 | } | |
785 | 787 | } | |
786 | 788 | ||
787 | 789 | ||
788 | 790 | ||
789 | 791 | @Callable(w) | |
790 | 792 | func leave () = { | |
791 | - | let | |
792 | - | func | |
793 | + | let dE = toString(w.originCaller) | |
794 | + | func dF (bS,H) = if ((H == dE)) | |
793 | 795 | then bS | |
794 | 796 | else (bS :+ H) | |
795 | 797 | ||
796 | - | let | |
798 | + | let dG = { | |
797 | 799 | let bi = ax | |
798 | 800 | let bj = size(bi) | |
799 | 801 | let bk = nil | |
800 | 802 | func bl (bm,bn) = if ((bn >= bj)) | |
801 | 803 | then bm | |
802 | - | else | |
804 | + | else dF(bm, bi[bn]) | |
803 | 805 | ||
804 | 806 | func bo (bm,bn) = if ((bn >= bj)) | |
805 | 807 | then bm | |
806 | 808 | else throw("List size exceeds 50") | |
807 | 809 | ||
808 | 810 | bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
809 | 811 | } | |
810 | - | let | |
811 | - | let | |
812 | - | if (( | |
812 | + | let dH = K(dE) | |
813 | + | let dI = valueOrErrorMessage(getString(this, dH), "miner has never joined") | |
814 | + | if ((dI == dI)) | |
813 | 815 | then if ((au == w.originCaller)) | |
814 | 816 | then throw("designated miner can't leave") | |
815 | - | else [StringEntry(l, makeString_2C( | |
817 | + | else [StringEntry(l, makeString_2C(dG, d))] | |
816 | 818 | else throw("Strict value is not equal to itself.") | |
817 | 819 | } | |
818 | 820 | ||
819 | 821 | ||
820 | 822 | ||
821 | 823 | @Callable(w) | |
822 | 824 | func transfer (T) = { | |
823 | - | let | |
825 | + | let dJ = if ((size(T) == i)) | |
824 | 826 | then fromBase16String(T) | |
825 | 827 | else throw(((("Address should have " + toString(i)) + " characters, got ") + toString(size(T)))) | |
826 | - | if (( | |
828 | + | if ((dJ == dJ)) | |
827 | 829 | then { | |
828 | - | let | |
830 | + | let dK = if ((size(w.payments) == 1)) | |
829 | 831 | then true | |
830 | 832 | else throw(("Expected one payment as a transfer amount, got " + toString(size(w.payments)))) | |
831 | - | if (( | |
833 | + | if ((dK == dK)) | |
832 | 834 | then { | |
833 | - | let | |
834 | - | let | |
835 | + | let dL = getStringValue(s) | |
836 | + | let dM = fromBase58String(dL) | |
835 | 837 | let ad = w.payments[0] | |
836 | - | let | |
838 | + | let dN = { | |
837 | 839 | let y = ad.assetId | |
838 | 840 | if ($isInstanceOf(y, "ByteVector")) | |
839 | 841 | then { | |
840 | - | let | |
841 | - | if (( | |
842 | + | let dO = y | |
843 | + | if ((dO == dM)) | |
842 | 844 | then true | |
843 | - | else throw(((("Expected " + | |
845 | + | else throw(((("Expected " + dL) + " in the payment, got ") + toBase58String(dO))) | |
844 | 846 | } | |
845 | - | else throw((("Expected " + | |
847 | + | else throw((("Expected " + dL) + " in the payment, got Waves")) | |
846 | 848 | } | |
847 | - | if (( | |
849 | + | if ((dN == dN)) | |
848 | 850 | then { | |
849 | - | let | |
850 | - | let af = (P - | |
851 | - | let | |
851 | + | let dP = az(ap)._6 | |
852 | + | let af = (P - dP) | |
853 | + | let dQ = if ((160 > af)) | |
852 | 854 | then ac(ad, 1000000, af) | |
853 | 855 | else if ((1600 > af)) | |
854 | 856 | then ac(ad, 10000000, af) | |
855 | 857 | else if ((3200 > af)) | |
856 | 858 | then ac(ad, 100000000, af) | |
857 | 859 | else if ((6400 > af)) | |
858 | 860 | then ac(ad, 1000000000, af) | |
859 | 861 | else throw((("Transfers denied for queue size of " + toString(af)) + ". Wait until current transfers processed")) | |
860 | - | if (( | |
861 | - | then [IntegerEntry(u, (P + 1)), S(P, T, ad.amount), Burn( | |
862 | + | if ((dQ == dQ)) | |
863 | + | then [IntegerEntry(u, (P + 1)), S(P, T, ad.amount), Burn(dM, ad.amount)] | |
862 | 864 | else throw("Strict value is not equal to itself.") | |
863 | 865 | } | |
864 | 866 | else throw("Strict value is not equal to itself.") | |
865 | 867 | } | |
866 | 868 | else throw("Strict value is not equal to itself.") | |
867 | 869 | } | |
868 | 870 | else throw("Strict value is not equal to itself.") | |
869 | 871 | } | |
870 | 872 | ||
871 | 873 | ||
872 | 874 | ||
873 | 875 | @Callable(w) | |
874 | - | func withdraw (A, | |
875 | - | let | |
876 | - | let | |
877 | - | let | |
878 | - | let | |
879 | - | if (( | |
880 | - | then throw(((("EL block #" + toString( | |
881 | - | else if ((size( | |
882 | - | then throw(((("Expected " + toString(h)) + " proofs, got ") + toString(size( | |
883 | - | else if ((0 > | |
884 | - | then throw(("Transfer index in block should be nonnegative, got " + toString( | |
876 | + | func withdraw (A,dR,dS,U) = { | |
877 | + | let dT = az(A) | |
878 | + | let dU = dT._1 | |
879 | + | let dV = az(getStringValue(r))._1 | |
880 | + | let dW = az(ap)._1 | |
881 | + | if ((dU > dV)) | |
882 | + | then throw(((("EL block #" + toString(dU)) + " is not finalized. The current finalized is #") + toString(dV))) | |
883 | + | else if ((size(dR) != h)) | |
884 | + | then throw(((("Expected " + toString(h)) + " proofs, got ") + toString(size(dR)))) | |
885 | + | else if ((0 > dS)) | |
886 | + | then throw(("Transfer index in block should be nonnegative, got " + toString(dS))) | |
885 | 887 | else if ((0 >= U)) | |
886 | 888 | then throw(("Amount should be positive, got " + toString(U))) | |
887 | 889 | else { | |
888 | - | let | |
889 | - | let | |
890 | - | let | |
891 | - | let y = getInteger(I( | |
890 | + | let dX = dT._4 | |
891 | + | let dY = (dX == am) | |
892 | + | let dZ = { | |
893 | + | let y = getInteger(I(dX)) | |
892 | 894 | if ($isInstanceOf(y, "Int")) | |
893 | 895 | then { | |
894 | - | let | |
895 | - | ( | |
896 | + | let ea = y | |
897 | + | (ea > dU) | |
896 | 898 | } | |
897 | - | else throw((((A + " is on an alternative chain #") + toString( | |
899 | + | else throw((((A + " is on an alternative chain #") + toString(dX)) + " that was not approved by majority. Wait for some blocks")) | |
898 | 900 | } | |
899 | - | if (if ( | |
901 | + | if (if (dY) | |
900 | 902 | then true | |
901 | - | else | |
903 | + | else dZ) | |
902 | 904 | then { | |
903 | - | let | |
904 | - | let | |
905 | - | let | |
906 | - | let | |
907 | - | let | |
908 | - | let | |
909 | - | let | |
910 | - | let | |
911 | - | if (( | |
905 | + | let eb = w.originCaller | |
906 | + | let ec = take(drop(eb.bytes, 2), f) | |
907 | + | let ed = base58'11111111111111111111111111111111111111111111' | |
908 | + | let ee = toBytes(U) | |
909 | + | let ef = ((ec + take(ed, (size(ed) - size(ee)))) + ee) | |
910 | + | let eg = blake2b256_16Kb(ef) | |
911 | + | let eh = createMerkleRoot(dR, eg, dS) | |
912 | + | let ei = dT._5 | |
913 | + | if ((eh == ei)) | |
912 | 914 | then { | |
913 | - | let | |
914 | - | let | |
915 | - | [Reissue( | |
915 | + | let dM = fromBase58String(getStringValue(s)) | |
916 | + | let ej = z(A) | |
917 | + | [Reissue(dM, U, true), ScriptTransfer(eb, U, dM), StringEntry(ej, cz(valueOrElse(getString(ej), ""), dS))] | |
916 | 918 | } | |
917 | - | else throw((((((("Expected root hash: " + toBase16String( | |
919 | + | else throw((((((("Expected root hash: " + toBase16String(ei)) + ", got: ") + toBase16String(eh)) + ". Event data digest: ") + toBase64String(eg)) + ". Check your withdraw arguments")) | |
918 | 920 | } | |
919 | 921 | else throw((("Expected " + A) + " to be either on the main chain or relate to it")) | |
920 | 922 | } | |
921 | 923 | } | |
922 | 924 | ||
923 | 925 | ||
924 | 926 | ||
925 | 927 | @Callable(w) | |
926 | - | func setup ( | |
928 | + | func setup (ek,el) = if (cb()) | |
927 | 929 | then throw("The contract has been already set up") | |
928 | - | else if ((0 > | |
930 | + | else if ((0 > el)) | |
929 | 931 | then throw("The miner reward must be nonnegative") | |
930 | 932 | else { | |
931 | - | let | |
932 | - | let | |
933 | + | let em = fromBase16String(ek) | |
934 | + | let en = if ((size(em) == e)) | |
933 | 935 | then true | |
934 | 936 | else throw("Wrong genesis block hash") | |
935 | - | if (( | |
937 | + | if ((en == en)) | |
936 | 938 | then { | |
937 | - | let | |
938 | - | let | |
939 | - | let | |
940 | - | let | |
941 | - | let | |
942 | - | let | |
943 | - | let | |
944 | - | [ | |
939 | + | let eo = base58'11111111111111111111111111111111' | |
940 | + | let ep = addressFromPublicKey(eo) | |
941 | + | let eq = base58'11111111111111111111' | |
942 | + | let er = "0000000000000000000000000000000000000000000000000000000000000000" | |
943 | + | let es = Issue("UNIT0", "Native token", 0, 8, true) | |
944 | + | let dM = calculateAssetId(es) | |
945 | + | let et = aK(ek, 0, er, 0, toBase16String(base58''), -1) | |
946 | + | [et, StringEntry(D(0), ek), ak(0, 0, ek), IntegerEntry(p, el), StringEntry(B(height), ((toString(ep) + ",0,") + ek)), StringEntry(r, ek), es, StringEntry(s, toBase58String(dM)), StringEntry(t, "0x0000000000000000000000000000000000006a7e")] | |
945 | 947 | } | |
946 | 948 | else throw("Strict value is not equal to itself.") | |
947 | 949 | } | |
948 | 950 | ||
949 | 951 |
github/deemru/w8io/169f3d6 141.90 ms ◑![]()