tx · 2bHT2EgMhM4ZWxo5j5EkM7hcuGRrp1HZAqHHZavPMkaV

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02500000 Waves

2023.09.14 07:07 [2754562] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "2bHT2EgMhM4ZWxo5j5EkM7hcuGRrp1HZAqHHZavPMkaV", "fee": 2500000, "feeAssetId": null, "timestamp": 1694664445836, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "5K8aow73Wqa5ukGpUxBG9GSPoGr24QryfrMwZMwsRznUKh4UA6E5ZHq7meKjET1kFAeS9cd1uxEEsr7RWmdoDPPp" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFkAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAEXVzZHRQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADmFydEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEQ19QUAAPZWFzdEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X0VBU1QAEXB1enpsZUFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIaY29uZl9hY2NlcHRlZF9hc3NldF9FVEhfUFAAEHdhdmVzQXNzZXRJZF9zdHICBVdBVkVTAA11c2R0UFBBc3NldElkCQDZBAEFEXVzZHRQUEFzc2V0SWRfc3RyAAphcnRBc3NldElkCQDZBAEFDmFydEFzc2V0SWRfc3RyAA11c2RjUFBBc3NldElkCQDZBAEFEXVzZGNQUEFzc2V0SWRfc3RyAAtlYXN0QXNzZXRJZAkA2QQBBQ9lYXN0QXNzZXRJZF9zdHIADXB1enpsZUFzc2V0SWQJANkEAQURcHV6emxlQXNzZXRJZF9zdHIADGV0aFBQQXNzZXRJZAkA2QQBBRBldGhQUEFzc2V0SWRfc3RyAAx3YXZlc0Fzc2V0SWQBAAATYWxsX2FjY2VwdGVkX2Fzc2V0cwkAzAgCBRF1c2R0UFBBc3NldElkX3N0cgkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCBRF1c2RjUFBBc3NldElkX3N0cgkAzAgCBQ9lYXN0QXNzZXRJZF9zdHIJAMwIAgURcHV6emxlQXNzZXRJZF9zdHIJAMwIAgUQd2F2ZXNBc3NldElkX3N0cgkAzAgCBRBldGhQUEFzc2V0SWRfc3RyBQNuaWwABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAOY29tbWlzc2lvbl9mZWUACAAOZGVmYXVsdExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECFGNvbmZfZGVmYXVsdF9saWNlbmNlABJkZWZhdWx0SGFzaExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZGVmYXVsdF9saWNlbmNlX2hhc2gAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAC3VzZXJSZW1vdmVkAgdSRU1PVkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQAC3VzZXJBbGxvd2VkAgdBTExPV0VEABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwEMdmFsaWRhdGVIYXNoAQRoYXNoCQAAAgkAsQIBBQRoYXNoAEABDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEHa2V5RGF0ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGF0ZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5hbWUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25hbWVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlEZXNjAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kZXNjXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RGlzcGxheUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZGlzcGxheV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlFeHBvcnRIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9leHBvcnRfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDGtleUV4cG9ydENpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBCmtleU1heE1pbnQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X3NpZ25pZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleUlzc3VlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfaXNzdWVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5T25TYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyAQ5rZXlMaWNlbmNlSGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhFhcnRfbGljZW5jZV9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5TGljZW5jZUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUYWdzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90YWdzXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VHlwZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdHlwZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5vdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlDcmF3bGVyAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9jcmF3bGVyX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDGtleVJveWFsdGllcwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5RW5kU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfZW5kc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBEmtleUFzc2V0SWRBY2NlcHRlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleUZsYWcCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBcnRpc3RBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgINYXJ0aXN0X2FnZW50XwUKYXJ0aXN0QWRkcgEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBGmtleVByaW1hcnlTaGFyZVB1YmxpY0FnZW50AQphcnRpc3RBZGRyCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBA0kdDAxMDAxNDEwMDUwCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwMDE0MTAwNTACXzEEBmFtb3VudAgFDSR0MDEwMDE0MTAwNTACXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQphcnRBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBA0kdDAxMDYzNzEwNjczCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwNjM3MTA2NzMCXzEEBmFtb3VudAgFDSR0MDEwNjM3MTA2NzMCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAQVwcmljZQMJAGcCAAAFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQDCQECIT0CBQZwdWJLZXkCAAkBC3ZhbHVlT3JFbHNlAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkCCV9mcmVlX3R4cwAAAAAEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQtpc1Nwb25zb3JlZAAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDAwkBAiE9AgUGcHViS2V5AgAJAGYCBQtpc1Nwb25zb3JlZAAABwkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCWCgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFC2lzU3BvbnNvcmVkAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEHYnV5TWludAYBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5BA0kdDAxMzI3ODEzMzY3CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDEzMjc4MTMzNjcCXzEEBmNhbGxlcggFDSR0MDEzMjc4MTMzNjcCXzIEBGRhdGUIBQ0kdDAxMzI3ODEzMzY3Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDEzMjc4MTMzNjcCXzQEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHAwMFBWlzQmlkCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyCQBpAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQAFCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQUKYXJ0QXNzZXRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDAwMJAQEhAQUFaXNCaWQJAQEhAQUOY2FsbGVySXNJc3N1ZXIHAwMJAGcCAAAFDGFydHdvcmtQcmljZQYJAQEhAQUIaXNPblNhbGUGCQBnAgAABQptYXhDYW5TZWxsBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUFaXNCaWQFDmNhbGxlcklzSXNzdWVyBwkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggaXNzdWFibGUgbm90IHNldAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBA0kdDAxNDk2NTE1MTU3AwUFaXNCaWQJARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQUKYmlkRGF0YUtleQkBFHZhbGlkYXRlUHJpY2VBc3NldElkAwUBaQUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UEBmFtb3VudAgFDSR0MDE0OTY1MTUxNTcCXzEEB2Fzc2V0SWQIBQ0kdDAxNDk2NTE1MTU3Al8yBAVhZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBEmtleUFydGlzdEFnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIECmFnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEFBmlzc3VlcgAABAtwdWJsaWNBZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIEEHB1YmxpY0FnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudAEFBmlzc3VlcgAABA1pc1doaXRlbGlzdGVkCQEOY2hlY2tXaGl0ZWxpc3QBBQZpc3N1ZXIEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFDmNvbW1pc3Npb25fZmVlAGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQCQTgAABBRhbW91bnRGb3JQdWJsaWNBZ2VudAMDAwkBAiE9AgULcHVibGljQWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUQcHVibGljQWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFEHB1YmxpY0FnZW50U2hhcmUAkE4AAAQQYW1vdW50Rm9yQ3JlYXRvcgkAZQIFBmFtb3VudAUNYW1vdW50Rm9yU2lnbgMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIMQXJ0IHNvbGQgb3V0BA1uZXdBbW91bnRTb2xkCQBkAgUKYW1vdW50U29sZAABBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAgosCiBBcnRJRDogBQVhcnRJZAIRLAogQXJ0d29yayBuYW1lOiAFC2FydHdvcmtOYW1lAgosCiBJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQIaXNzdWVORlQJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFCHRvdGFsTkZUAAEFCWlzc3VlTWV0YQABAAAHBAVpZE5GVAkAuAgBBQhpc3N1ZU5GVAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIECmFzc2V0SWRCaWQDCQEBIQEJAQlpc0RlZmluZWQBBQdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FBWFydElkAgFfBQZpc3N1ZXIECXNvbGRWYWx1ZQMJAQEhAQUFaXNCaWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFDGFydHdvcmtQcmljZQIBXwUMcHJpY2VBc3NldElkAgFfCQDYBAEFBWlkTkZUCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRCaWQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEFGNvbW1pc3Npb25zV2l0aEFnZW50AwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUFYWdlbnQFDmFtb3VudEZvckFnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQ1hbW91bnRGb3JTaWduBQdhc3NldElkBQNuaWwEGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50AwkBAiE9AgUUYW1vdW50Rm9yUHVibGljQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULcHVibGljQWdlbnQFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIJAGUCBRBhbW91bnRGb3JDcmVhdG9yBRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEGFtb3VudEZvckNyZWF0b3IFB2Fzc2V0SWQFA25pbAQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwEBmJ1eVJlcwkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQFDW5ld0Ftb3VudFNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUIdG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAUUY29tbWlzc2lvbnNXaXRoQWdlbnQFGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50BQp0eFRvQ2FsbGVyAwUFaXNCaWQJAMwIAgUIc29sZERhdGEJAMwIAgUJYmlkVXBkYXRlCQDMCAIFCWJpZERlbE9sZAUGYnV5UmVzCQDMCAIFCHNvbGREYXRhBQZidXlSZXMBCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAoGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAWkBCmFkZEFydHdvcmsMBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5BA0kdDAyMDc0ODIwODIxCQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAVhcnRJZAgFDSR0MDIwNzQ4MjA4MjECXzEEBmNhbGxlcggFDSR0MDIwNzQ4MjA4MjECXzIEBGRhdGUIBQ0kdDAyMDc0ODIwODIxAl8zBAtpc1Nwb25zb3JlZAgFDSR0MDIwNzQ4MjA4MjECXzQEDSR0MDIwODMxMjA5MDAJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDIwODMxMjA5MDACXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjA4MzEyMDkwMAJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEEHdoaXRlbGlzdGVkX2Ryb3AJAGYCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIFBmNhbGxlcgILX2ZyZWVfZHJvcHMAAAQNJHQwMjExOTkyMTI4NwMFEHdoaXRlbGlzdGVkX2Ryb3AJAJQKAgAABQphcnRBc3NldElkCQEPdmFsaWRhdGVQYXltZW50AQUBaQQGYW1vdW50CAUNJHQwMjExOTkyMTI4NwJfMQQHYXNzZXRJZAgFDSR0MDIxMTk5MjEyODcCXzIDCQEBIQEJAQlpc0RlZmluZWQBBQZhbW91bnQJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3ADBRB3aGl0ZWxpc3RlZF9kcm9wCQD8BwQFDXdoaXRlbGlzdERhcHACC3VzZUZyZWVEcm9wCQDMCAIFBmNhbGxlcgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5RGF0ZQIFBmNhbGxlcgUFYXJ0SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQVhcnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBWFydElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBWFydElkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBWFydElkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQVhcnRJZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBWFydElkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQVhcnRJZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUFYXJ0SWQFBHRhZ3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBWFydElkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQVhcnRJZAUJcm95YWx0aWVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUGYW1vdW50BQphcnRBc3NldElkBQNuaWwFCnR4VG9DYWxsZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdXBkYXRlQXJ0d29yaw0EdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQNJHQwMjMyMDIyMzI3MgkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyMzIwMjIzMjcyAl8xBAZjYWxsZXIIBQ0kdDAyMzIwMjIzMjcyAl8yBARkYXRlCAUNJHQwMjMyMDIyMzI3MgJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyMzIwMjIzMjcyAl80BA0kdDAyMzI4MjIzMzUxCQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMzI4MjIzMzUxAl8xBAtsaWNlbmNlSGFzaAgFDSR0MDIzMjgyMjMzNTECXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAUKdHhUb0NhbGxlcgkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjQ5NzgyNTAxMgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjQ5NzgyNTAxMgJfMQQGY2FsbGVyCAUNJHQwMjQ5NzgyNTAxMgJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNTQ0ODI1NDgyCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNTQ0ODI1NDgyAl8xBAZjYWxsZXIIBQ0kdDAyNTQ0ODI1NDgyAl8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAQGc2lnbklEAwkAAAIFCnNoYTI1Nkhhc2gCAAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQCAAQNc2lnbklEX2xlZ2FjeQMJAAACBQZzaWduSUQCAAUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlpZEJ5U2lnbmlkAgUJYWRkclRvVXNlBQZzaWduSUQFA25pbAQMZGF0YVRvRGVsZXRlCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURhdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGVzYwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleURpc3BsYXlDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFeHBvcnRDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlFeHBvcnRIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5TGljZW5jZUhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlMaWNlbmNlQ2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VHlwZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVRhZ3MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlNYXhNaW50AgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5T25TYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RmxhZwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCGtleVByaWNlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlFbmRTYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Tm90ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUNyYXdsZXICBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlSb3lhbHRpZXMCBQlhZGRyVG9Vc2UFBWFydElkBQNuaWwFDXNpZ25JRF9sZWdhY3kDCQEBIQEJAQtpc0FydE1pbnRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cFDGRhdGFUb0RlbGV0ZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFDGRhdGFUb0RlbGV0ZQkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQBaQELc2VsbEFydHdvcmsGBWFydElkBXByaWNlB21heE1pbnQHYXNzZXRJZAhibG9ja0VuZAZwdWJLZXkEDSR0MDI4MjYxMjgzMzEJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMjgyNjEyODMzMQJfMQQGY2FsbGVyCAUNJHQwMjgyNjEyODMzMQJfMgQEZGF0ZQgFDSR0MDI4MjYxMjgzMzECXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjgyNjEyODMzMQJfNAQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQVhcnRJZAMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAAgECD0ZsYWdnZWQgYXJ0d29yawQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkAwkAZgIAAAUIYmxvY2tFbmQJAAIBAgxOZWdhdGl2ZSBlbmQDAwkAZgIFCGJsb2NrRW5kAAADCQECIT0CBQdtYXhNaW50AAEGCQECIT0CBQVwcmljZQAABwkAAgECOlRpbWVkIG9mZmVyIG9ubHkgYWxsb3dlZCBmb3IgdW5pcXVlIGVkaXRpb24gYW5kIG9mZmVyIG9ubHkECmJhc2VIZWlnaHQDCQAAAgUIYmxvY2tFbmQAAAAABQZoZWlnaHQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBXByaWNlCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAwkAZgIFB21heE1pbnQAZAkAAgECHDEwMCBlZGl0aW9ucyBtYXggcGVyIGFydHdvcmsDAwkBAiE9AgUKYW1vdW50U29sZAAACQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggZWRpdGlvbiByZWFjaGVkLgMDCQBmAgUKYW1vdW50U29sZAAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECJkNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSBhbnltb3JlAwMJAGYCBQZiaWROYnIAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBApzZWxsU3RhdHVzAwMJAGYCBQVwcmljZQAACQBmAgUHbWF4TWludAAABwYHBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCGtleVByaWNlAgUGY2FsbGVyBQVhcnRJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAUHbWF4TWludAkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGY2FsbGVyBQVhcnRJZAUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkCQBkAgUKYmFzZUhlaWdodAUIYmxvY2tFbmQFA25pbAUKdHhUb0NhbGxlcgFpAQpidXlBcnR3b3JrAgVhcnRJZAZpc3N1ZXIJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgIAAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMzA3MDQzMDc0NAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzA3MDQzMDc0NAJfMQQGY2FsbGVyCAUNJHQwMzA3MDQzMDc0NAJfMgQEZGF0ZQgFDSR0MDMwNzA0MzA3NDQCXzMEDSR0MDMwNzQ5MzA3ODUJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMzA3NDkzMDc4NQJfMQQGYW1vdW50CAUNJHQwMzA3NDkzMDc4NQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQFBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgZwdWJLZXkJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyBQZwdWJLZXkBaQEJY2FuY2VsQmlkBAVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDMyMTA5MzIxNzAJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMyMTA5MzIxNzACXzEEBmNhbGxlcggFDSR0MDMyMTA5MzIxNzACXzIEBGRhdGUIBQ0kdDAzMjEwOTMyMTcwAl8zAwMJAQIhPQIFBmNhbGxlcgUIYmlkT3duZXIJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EDXJldHVybk1vbmV5VG8DCQAAAgUGY2FsbGVyBQZpc3N1ZXIFCGJpZE93bmVyBQZjYWxsZXIEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFCmJpZERhdGFLZXkCAV8FCWJpZFN0YXR1cwkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBlAgUGYmlkTmJyAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFDXJldHVybk1vbmV5VG8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEFB2Fzc2V0SWQFA25pbAECdHgBCHZlcmlmaWVyAAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgphZGRBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAsDAwMDCQAAAggFA2ludghmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAMAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAUDAwMDCQAAAggFA2ludghmdW5jdGlvbgIJYWNjZXB0QmlkCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQDIEwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAQJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkkEORe", "height": 2754562, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DqidiFLDt3uz7Qp2Uks12cZnk8uBm5oT9SizVwP2SiJf Next: 3irL3BVg5nudAZhzRZ69UzmuhZaY2KSf5EKESMF9JkUy Diff:
OldNewDifferences
407407 then throw("Sale ended.")
408408 else {
409409 let callerIsIssuer = (caller == issuer)
410- if (true)
411- then throw(toString(callerIsIssuer))
410+ let totalNFT = getIntegerByKey("total_nft_issued")
411+ let artworkName = getStringByKey(keyName(issuer, artId))
412+ if ((artworkName == ""))
413+ then throw("Art doesn't exist")
412414 else {
413- let totalNFT = getIntegerByKey("total_nft_issued")
414- let artworkName = getStringByKey(keyName(issuer, artId))
415- if ((artworkName == ""))
416- then throw("Art doesn't exist")
417- else {
418- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
419- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
420- let artworkPrice = if (callerIsIssuer)
421- then (currentCertificationPrice / 5)
422- else getIntegerByKey(keyPrice(issuer, artId))
423- let priceAssetId = if (callerIsIssuer)
424- then toBase58String(artAssetId)
425- else getStringByKey(keyAssetIdAccepted(issuer, artId))
426- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
427- if (if (if (!(isBid))
428- then !(callerIsIssuer)
429- else false)
430- then if (if ((0 >= artworkPrice))
431- then true
432- else !(isOnSale))
433- then true
434- else (0 >= maxCanSell)
435- else false)
436- then throw("Art not for sale")
437- else if (if (if (!(isBid))
438- then callerIsIssuer
415+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
416+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
417+ let artworkPrice = if (callerIsIssuer)
418+ then (currentCertificationPrice / 5)
419+ else getIntegerByKey(keyPrice(issuer, artId))
420+ let priceAssetId = if (callerIsIssuer)
421+ then toBase58String(artAssetId)
422+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
423+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
424+ if (if (if (!(isBid))
425+ then !(callerIsIssuer)
426+ else false)
427+ then if (if ((0 >= artworkPrice))
428+ then true
429+ else !(isOnSale))
430+ then true
431+ else (0 >= maxCanSell)
432+ else false)
433+ then throw("Art not for sale")
434+ else if (if (if (!(isBid))
435+ then callerIsIssuer
436+ else false)
437+ then (0 >= maxCanSell)
438+ else false)
439+ then throw("Max issuable not set")
440+ else {
441+ let checkUser = validateUser(issuer)
442+ if (if (isBid)
443+ then (checkUser != "")
439444 else false)
440- then (0 >= maxCanSell)
441- else false)
442- then throw("Max issuable not set")
445+ then throw(checkUser)
443446 else {
444- let checkUser = validateUser(issuer)
445- if (if (isBid)
446- then (checkUser != "")
447+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
448+ let $t01496515157 = if (isBid)
449+ then getPriceAssetIdFromBid(bidDataKey)
450+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
451+ let amount = $t01496515157._1
452+ let assetId = $t01496515157._2
453+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
454+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
455+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
456+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
457+ let isWhitelisted = checkWhitelist(issuer)
458+ let amountForSign = fraction(amount, commission_fee, 100)
459+ let amountForAgent = if (if (if ((agent != feeReceiver))
460+ then (agentShare > 0)
447461 else false)
448- then throw(checkUser)
462+ then (height > isWhitelisted)
463+ else false)
464+ then fraction(amount, agentShare, 10000)
465+ else 0
466+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
467+ then (publicAgentShare > 0)
468+ else false)
469+ then (height > isWhitelisted)
470+ else false)
471+ then fraction(amount, publicAgentShare, 10000)
472+ else 0
473+ let amountForCreator = (amount - amountForSign)
474+ if ((amountSold == maxCanSell))
475+ then throw("Art sold out")
449476 else {
450- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
451- let $t01502015212 = if (isBid)
452- then getPriceAssetIdFromBid(bidDataKey)
453- else validatePriceAssetId(i, priceAssetId, artworkPrice)
454- let amount = $t01502015212._1
455- let assetId = $t01502015212._2
456- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
457- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
458- let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
459- let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
460- let isWhitelisted = checkWhitelist(issuer)
461- let amountForSign = fraction(amount, commission_fee, 100)
462- let amountForAgent = if (if (if ((agent != feeReceiver))
463- then (agentShare > 0)
464- else false)
465- then (height > isWhitelisted)
466- else false)
467- then fraction(amount, agentShare, 10000)
468- else 0
469- let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
470- then (publicAgentShare > 0)
471- else false)
472- then (height > isWhitelisted)
473- else false)
474- then fraction(amount, publicAgentShare, 10000)
475- else 0
476- let amountForCreator = (amount - amountForSign)
477- if ((amountSold == maxCanSell))
478- then throw("Art sold out")
479- else {
480- let newAmountSold = (amountSold + 1)
481- let issueMeta = ((((((((("Creator: " + issuer) + ",
477+ let newAmountSold = (amountSold + 1)
478+ let issueMeta = ((((((((("Creator: " + issuer) + ",
482479 ArtID: ") + artId) + ",
483480 Artwork name: ") + artworkName) + ",
484481 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
485- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
486- let idNFT = calculateAssetId(issueNFT)
487- let sellStatus = if (if ((newAmountSold == maxCanSell))
488- then true
489- else !(isOnSale))
490- then false
491- else true
492- let receiveNFT = if (if (if ((caller == issuer))
493- then (bidOwner != "")
494- else false)
495- then (bidId != "")
496- else false)
497- then addressFromStringValue(bidOwner)
498- else i.caller
499- let assetIdBid = if (!(isDefined(assetId)))
500- then "WAVES"
501- else toBase58String(value(assetId))
502- let bidData = getStringByKey((bidDataKey + "_OPEN"))
503- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
504- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
505- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
506- let soldValue = if (!(isBid))
507- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
508- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
509- let soldData = StringEntry(soldKey, soldValue)
510- let commissionsWithAgent = if ((amountForAgent != 0))
511- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
512- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
513- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
514- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
515- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
516- let txToCaller = if (isSponsored)
517- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
518- else nil
519- let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
520- if (isBid)
521- then [soldData, bidUpdate, bidDelOld] :: buyRes
522- else soldData :: buyRes
523- }
482+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
483+ let idNFT = calculateAssetId(issueNFT)
484+ let sellStatus = if (if ((newAmountSold == maxCanSell))
485+ then true
486+ else !(isOnSale))
487+ then false
488+ else true
489+ let receiveNFT = if (if (if ((caller == issuer))
490+ then (bidOwner != "")
491+ else false)
492+ then (bidId != "")
493+ else false)
494+ then addressFromStringValue(bidOwner)
495+ else i.caller
496+ let assetIdBid = if (!(isDefined(assetId)))
497+ then "WAVES"
498+ else toBase58String(value(assetId))
499+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
500+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
501+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
502+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
503+ let soldValue = if (!(isBid))
504+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
505+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
506+ let soldData = StringEntry(soldKey, soldValue)
507+ let commissionsWithAgent = if ((amountForAgent != 0))
508+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
509+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
510+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
511+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
512+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
513+ let txToCaller = if (isSponsored)
514+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
515+ else nil
516+ let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
517+ if (isBid)
518+ then [soldData, bidUpdate, bidDelOld] :: buyRes
519+ else soldData :: buyRes
524520 }
525521 }
526- }
522+ }
527523 }
528524 }
529525 }
552548
553549 @Callable(i)
554550 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
555- let $t02080320876 = idCallerDateSponsored(i, pubKey)
556- let artId = $t02080320876._1
557- let caller = $t02080320876._2
558- let date = $t02080320876._3
559- let isSponsored = $t02080320876._4
560- let $t02088620955 = setLIcence(cidLicence, sha256Licence)
561- let licenceCID = $t02088620955._1
562- let licenceHash = $t02088620955._2
551+ let $t02074820821 = idCallerDateSponsored(i, pubKey)
552+ let artId = $t02074820821._1
553+ let caller = $t02074820821._2
554+ let date = $t02074820821._3
555+ let isSponsored = $t02074820821._4
556+ let $t02083120900 = setLIcence(cidLicence, sha256Licence)
557+ let licenceCID = $t02083120900._1
558+ let licenceHash = $t02083120900._2
563559 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
564560 if ((validateArtwork != ""))
565561 then throw("Something went wrong!")
566562 else {
567563 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
568- let $t02125421342 = if (whitelisted_drop)
564+ let $t02119921287 = if (whitelisted_drop)
569565 then $Tuple2(0, artAssetId)
570566 else validatePayment(i)
571- let amount = $t02125421342._1
572- let assetId = $t02125421342._2
567+ let amount = $t02119921287._1
568+ let assetId = $t02119921287._2
573569 if (!(isDefined(amount)))
574570 then throw("Something went wrong")
575571 else {
594590 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
595591 then throw(maintenanceMSG)
596592 else {
597- let $t02325723327 = idCallerDateSponsored(i, pubKey)
598- let id = $t02325723327._1
599- let caller = $t02325723327._2
600- let date = $t02325723327._3
601- let isSponsored = $t02325723327._4
602- let $t02333723406 = setLIcence(cidLicence, sha256Licence)
603- let licenceCID = $t02333723406._1
604- let licenceHash = $t02333723406._2
593+ let $t02320223272 = idCallerDateSponsored(i, pubKey)
594+ let id = $t02320223272._1
595+ let caller = $t02320223272._2
596+ let date = $t02320223272._3
597+ let isSponsored = $t02320223272._4
598+ let $t02328223351 = setLIcence(cidLicence, sha256Licence)
599+ let licenceCID = $t02328223351._1
600+ let licenceHash = $t02328223351._2
605601 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
606602 if ((validateArtwork != ""))
607603 then throw("Something went wrong!")
629625
630626 @Callable(i)
631627 func flagArtwork (artId,addr,flag,note) = {
632- let $t02503325067 = idCallerDate(i)
633- let id = $t02503325067._1
634- let caller = $t02503325067._2
628+ let $t02497825012 = idCallerDate(i)
629+ let id = $t02497825012._1
630+ let caller = $t02497825012._2
635631 if (containsElement([chris, toString(this)], caller))
636632 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
637633 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
643639
644640 @Callable(i)
645641 func deleteArtwork (artId,addr) = {
646- let $t02550325537 = idCallerDate(i)
647- let id = $t02550325537._1
648- let caller = $t02550325537._2
642+ let $t02544825482 = idCallerDate(i)
643+ let id = $t02544825482._1
644+ let caller = $t02544825482._2
649645 let addrToUse = if (containsElement([chris, toString(this)], caller))
650646 then addr
651647 else caller
675671
676672 @Callable(i)
677673 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
678- let $t02831628386 = idCallerDateSponsored(i, pubKey)
679- let id = $t02831628386._1
680- let caller = $t02831628386._2
681- let date = $t02831628386._3
682- let isSponsored = $t02831628386._4
674+ let $t02826128331 = idCallerDateSponsored(i, pubKey)
675+ let id = $t02826128331._1
676+ let caller = $t02826128331._2
677+ let date = $t02826128331._3
678+ let isSponsored = $t02826128331._4
683679 let artworkName = getStringByKey(keyName(caller, artId))
684680 if ((artworkName == ""))
685681 then throw("This art doesn't match your account")
753749
754750 @Callable(i)
755751 func setBid (artId,issuer) = {
756- let $t03075930799 = idCallerDate(i)
757- let id = $t03075930799._1
758- let caller = $t03075930799._2
759- let date = $t03075930799._3
760- let $t03080430840 = isPayment(i)
761- let payment = $t03080430840._1
762- let amount = $t03080430840._2
752+ let $t03070430744 = idCallerDate(i)
753+ let id = $t03070430744._1
754+ let caller = $t03070430744._2
755+ let date = $t03070430744._3
756+ let $t03074930785 = isPayment(i)
757+ let payment = $t03074930785._1
758+ let amount = $t03074930785._2
763759 let assetId = if (!(isDefined(payment.assetId)))
764760 then "WAVES"
765761 else toBase58String(value(payment.assetId))
795791
796792 @Callable(i)
797793 func cancelBid (artId,issuer,bidId,bidOwner) = {
798- let $t03216432225 = idCallerDate(i)
799- let id = $t03216432225._1
800- let caller = $t03216432225._2
801- let date = $t03216432225._3
794+ let $t03210932170 = idCallerDate(i)
795+ let id = $t03210932170._1
796+ let caller = $t03210932170._2
797+ let date = $t03210932170._3
802798 if (if ((caller != bidOwner))
803799 then (caller != issuer)
804800 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "2.0.0"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let unitTest = false
1010
1111 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1212
1313 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1414
1515 let feeReceiver = getStringByKey("conf_fee_receiver")
1616
1717 let userDapp = if (unitTest)
1818 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1919 else value(addressFromString(getStringByKey("conf_users_dapp")))
2020
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2222
2323 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2424
2525 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
2626
2727 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
2828
2929 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3030
3131 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3232
3333 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3434
3535 let wavesAssetId_str = "WAVES"
3636
3737 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
3838
3939 let artAssetId = fromBase58String(artAssetId_str)
4040
4141 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4242
4343 let eastAssetId = fromBase58String(eastAssetId_str)
4444
4545 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
4646
4747 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
4848
4949 let wavesAssetId = base58''
5050
5151 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5252
5353 let chris = getStringByKey("conf_admin_1")
5454
5555 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5656
5757
5858 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5959
6060
6161 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6262
6363
6464 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6565
6666
6767 let commission_fee = 8
6868
6969 let defaultLicence = getStringByKey("conf_default_licence")
7070
7171 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7272
7373 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7474
7575 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
7676
7777 let userSuspended = "SUSPENDED"
7878
7979 let userRemoved = "REMOVED"
8080
8181 let userUnregistered = "UNREGISTERED"
8282
8383 let userAllowed = "ALLOWED"
8484
8585 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
8686
8787 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
8888
8989
9090 func validateCID (cid) = if (contains(cid, "/"))
9191 then if (if ((76 > size(cid)))
9292 then (size(split(cid, "/")[0]) == 59)
9393 else false)
9494 then (16 > size(split(cid, "/")[1]))
9595 else false
9696 else false
9797
9898
9999 func validateHash (hash) = (size(hash) == 64)
100100
101101
102102 func keyUserStatus (caller) = ("user_status_" + caller)
103103
104104
105105 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
106106
107107
108108 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
109109
110110
111111 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
112112
113113
114114 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
115115
116116
117117 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
118118
119119
120120 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
121121
122122
123123 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
124124
125125
126126 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
127127
128128
129129 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
130130
131131
132132 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
133133
134134
135135 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
136136
137137
138138 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
139139
140140
141141 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
142142
143143
144144 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
145145
146146
147147 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
148148
149149
150150 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
151151
152152
153153 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
154154
155155
156156 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
157157
158158
159159 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
160160
161161
162162 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
163163
164164
165165 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
166166
167167
168168 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
169169
170170
171171 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
172172
173173
174174 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
175175
176176
177177 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
178178
179179
180180 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
181181
182182
183183 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
184184
185185
186186 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
187187
188188
189189 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
190190 then throw("Wrong Display CID")
191191 else if (!(validateCID(cidExport)))
192192 then throw("Wrong Export CID")
193193 else if (if ((cidLicence != ""))
194194 then !(validateCID(cidLicence))
195195 else false)
196196 then throw("Wrong Licence CID")
197197 else true
198198
199199
200200 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
201201 then throw("Export Hash 64 char. max")
202202 else if (!(validateHash(sha256Licence)))
203203 then throw("Licence Hash 64 char. max")
204204 else true
205205
206206
207207 func validateString (str,max) = if ((size(str) == 0))
208208 then throw("Field cannot be is empty")
209209 else if ((size(str) > max))
210210 then throw((str + " is too long"))
211211 else true
212212
213213
214214 func validateUser (caller) = {
215215 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
216216 if (if ((userStatus == userUnregistered))
217217 then true
218218 else (userStatus == userAllowed))
219219 then "Register this account first with \"Account\" tab"
220220 else if ((userStatus == userSuspended))
221221 then "Account suspended"
222222 else if ((userStatus == userRemoved))
223223 then "Account removed"
224224 else ""
225225 }
226226
227227
228228 func setLIcence (cidLicence,sha256Licence) = {
229229 let cid = if ((size(cidLicence) == 0))
230230 then defaultLicence
231231 else cidLicence
232232 let hash = if ((size(sha256Licence) == 0))
233233 then defaultHashLicence
234234 else sha256Licence
235235 $Tuple2(cid, hash)
236236 }
237237
238238
239239 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
240240 let checkUser = validateUser(caller)
241241 if ((checkUser != ""))
242242 then throw(checkUser)
243243 else if ((size(cidDisplay) == 0))
244244 then throw("Display CID cannot be empty")
245245 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
246246 then throw("Problem with CID")
247247 else if (!(validateAllHash(sha256Export, licenceHash)))
248248 then throw("Problem with Hashes")
249249 else if (!(validateString(name, 100)))
250250 then throw("100 Char. max name")
251251 else if (!(validateString(description, 1000)))
252252 then throw("1000 Char. max description")
253253 else if (if ((0 > royalties))
254254 then true
255255 else (royalties > 1000))
256256 then throw("Royalties cannot be less than 0% or higher than 10%")
257257 else if ((size(split(tags, ",")) > 5))
258258 then throw("5 tags max.")
259259 else ""
260260 }
261261
262262
263263 func isPayment (i) = if ((size(i.payments) == 0))
264264 then throw("No payment attached")
265265 else {
266266 let payment = value(i.payments[0])
267267 let amount = value(payment.amount)
268268 $Tuple2(payment, amount)
269269 }
270270
271271
272272 func validatePayment (i) = {
273273 let $t01001410050 = isPayment(i)
274274 let payment = $t01001410050._1
275275 let amount = $t01001410050._2
276276 let assetId = if (if (isDefined(payment.assetId))
277277 then (payment.assetId == artAssetId)
278278 else false)
279279 then payment.assetId
280280 else throw("Only SIGN token accepted as transaction fee")
281281 if ((amount != currentCertificationPrice))
282282 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
283283 else $Tuple2(amount, assetId)
284284 }
285285
286286
287287 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
288288 case b: Int =>
289289 if ((b != 0))
290290 then true
291291 else false
292292 case _ =>
293293 false
294294 }
295295
296296
297297 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
298298 let $t01063710673 = isPayment(i)
299299 let payment = $t01063710673._1
300300 let amount = $t01063710673._2
301301 let assetId = if (!(isDefined(payment.assetId)))
302302 then unit
303303 else if (if ((size(priceAssetId) > 0))
304304 then (toBase58String(value(payment.assetId)) == priceAssetId)
305305 else false)
306306 then payment.assetId
307307 else throw("Wrong asset id")
308308 if (if ((assetId == unit))
309309 then (priceAssetId != "")
310310 else false)
311311 then throw("Wrong asset id")
312312 else if ((artworkPrice != amount))
313313 then throw("Payment don't match")
314314 else $Tuple2(amount, assetId)
315315 }
316316
317317
318318 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
319319 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
320320 else true
321321
322322
323323 func validateMinSell (price) = if ((0 >= price))
324324 then throw("Wrong minimum sell price")
325325 else true
326326
327327
328328 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
329329 then unit
330330 else fromBase58String(assetId)
331331
332332
333333 func getPriceAssetIdFromBid (bidDataKey) = {
334334 let bidData = getStringByKey((bidDataKey + "_OPEN"))
335335 if ((bidData == ""))
336336 then throw("Bid not found")
337337 else {
338338 let bidDataArr = split(bidData, "_")
339339 let bidAmount = parseIntValue(bidDataArr[1])
340340 let bidAssetId = getBidAssetId(bidDataArr[0])
341341 if ((0 >= bidAmount))
342342 then throw("Wrong amount")
343343 else $Tuple2(bidAmount, bidAssetId)
344344 }
345345 }
346346
347347
348348 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
349349 then throw(maintenanceMSG)
350350 else {
351351 let isSponsored = if ((pubKey != ""))
352352 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
353353 else 0
354354 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
355355 then (isSponsored > 0)
356356 else false)
357357 then toString(addressFromPublicKey(fromBase58String(pubKey)))
358358 else toBase58String(i.caller.bytes)
359359 let get_sponsored_waves = if (if ((pubKey != ""))
360360 then (isSponsored > 0)
361361 else false)
362362 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
363363 else unit
364364 if ((get_sponsored_waves == get_sponsored_waves))
365365 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
366366 else throw("Strict value is not equal to itself.")
367367 }
368368
369369
370370 func idCallerDate (i) = if (!(dappRunning))
371371 then throw(maintenanceMSG)
372372 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
373373
374374
375375 func getBalance (assetId) = match assetId {
376376 case b: ByteVector =>
377377 assetBalance(this, b)
378378 case _ =>
379379 wavesBalance(this).available
380380 }
381381
382382
383383 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
384384 let $t01327813367 = idCallerDateSponsored(i, pubKey)
385385 let id = $t01327813367._1
386386 let caller = $t01327813367._2
387387 let date = $t01327813367._3
388388 let isSponsored = $t01327813367._4
389389 let isBid = if (if (if ((caller == issuer))
390390 then (bidOwner != "")
391391 else false)
392392 then (bidId != "")
393393 else false)
394394 then true
395395 else false
396396 if (if (isBid)
397397 then (caller != issuer)
398398 else false)
399399 then throw("You cannot do this action")
400400 else {
401401 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
402402 if (if (if ((blockEnd != 0))
403403 then (height >= blockEnd)
404404 else false)
405405 then !(isBid)
406406 else false)
407407 then throw("Sale ended.")
408408 else {
409409 let callerIsIssuer = (caller == issuer)
410- if (true)
411- then throw(toString(callerIsIssuer))
410+ let totalNFT = getIntegerByKey("total_nft_issued")
411+ let artworkName = getStringByKey(keyName(issuer, artId))
412+ if ((artworkName == ""))
413+ then throw("Art doesn't exist")
412414 else {
413- let totalNFT = getIntegerByKey("total_nft_issued")
414- let artworkName = getStringByKey(keyName(issuer, artId))
415- if ((artworkName == ""))
416- then throw("Art doesn't exist")
417- else {
418- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
419- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
420- let artworkPrice = if (callerIsIssuer)
421- then (currentCertificationPrice / 5)
422- else getIntegerByKey(keyPrice(issuer, artId))
423- let priceAssetId = if (callerIsIssuer)
424- then toBase58String(artAssetId)
425- else getStringByKey(keyAssetIdAccepted(issuer, artId))
426- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
427- if (if (if (!(isBid))
428- then !(callerIsIssuer)
429- else false)
430- then if (if ((0 >= artworkPrice))
431- then true
432- else !(isOnSale))
433- then true
434- else (0 >= maxCanSell)
435- else false)
436- then throw("Art not for sale")
437- else if (if (if (!(isBid))
438- then callerIsIssuer
415+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
416+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
417+ let artworkPrice = if (callerIsIssuer)
418+ then (currentCertificationPrice / 5)
419+ else getIntegerByKey(keyPrice(issuer, artId))
420+ let priceAssetId = if (callerIsIssuer)
421+ then toBase58String(artAssetId)
422+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
423+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
424+ if (if (if (!(isBid))
425+ then !(callerIsIssuer)
426+ else false)
427+ then if (if ((0 >= artworkPrice))
428+ then true
429+ else !(isOnSale))
430+ then true
431+ else (0 >= maxCanSell)
432+ else false)
433+ then throw("Art not for sale")
434+ else if (if (if (!(isBid))
435+ then callerIsIssuer
436+ else false)
437+ then (0 >= maxCanSell)
438+ else false)
439+ then throw("Max issuable not set")
440+ else {
441+ let checkUser = validateUser(issuer)
442+ if (if (isBid)
443+ then (checkUser != "")
439444 else false)
440- then (0 >= maxCanSell)
441- else false)
442- then throw("Max issuable not set")
445+ then throw(checkUser)
443446 else {
444- let checkUser = validateUser(issuer)
445- if (if (isBid)
446- then (checkUser != "")
447+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
448+ let $t01496515157 = if (isBid)
449+ then getPriceAssetIdFromBid(bidDataKey)
450+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
451+ let amount = $t01496515157._1
452+ let assetId = $t01496515157._2
453+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
454+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
455+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
456+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
457+ let isWhitelisted = checkWhitelist(issuer)
458+ let amountForSign = fraction(amount, commission_fee, 100)
459+ let amountForAgent = if (if (if ((agent != feeReceiver))
460+ then (agentShare > 0)
447461 else false)
448- then throw(checkUser)
462+ then (height > isWhitelisted)
463+ else false)
464+ then fraction(amount, agentShare, 10000)
465+ else 0
466+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
467+ then (publicAgentShare > 0)
468+ else false)
469+ then (height > isWhitelisted)
470+ else false)
471+ then fraction(amount, publicAgentShare, 10000)
472+ else 0
473+ let amountForCreator = (amount - amountForSign)
474+ if ((amountSold == maxCanSell))
475+ then throw("Art sold out")
449476 else {
450- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
451- let $t01502015212 = if (isBid)
452- then getPriceAssetIdFromBid(bidDataKey)
453- else validatePriceAssetId(i, priceAssetId, artworkPrice)
454- let amount = $t01502015212._1
455- let assetId = $t01502015212._2
456- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
457- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
458- let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
459- let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
460- let isWhitelisted = checkWhitelist(issuer)
461- let amountForSign = fraction(amount, commission_fee, 100)
462- let amountForAgent = if (if (if ((agent != feeReceiver))
463- then (agentShare > 0)
464- else false)
465- then (height > isWhitelisted)
466- else false)
467- then fraction(amount, agentShare, 10000)
468- else 0
469- let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
470- then (publicAgentShare > 0)
471- else false)
472- then (height > isWhitelisted)
473- else false)
474- then fraction(amount, publicAgentShare, 10000)
475- else 0
476- let amountForCreator = (amount - amountForSign)
477- if ((amountSold == maxCanSell))
478- then throw("Art sold out")
479- else {
480- let newAmountSold = (amountSold + 1)
481- let issueMeta = ((((((((("Creator: " + issuer) + ",
477+ let newAmountSold = (amountSold + 1)
478+ let issueMeta = ((((((((("Creator: " + issuer) + ",
482479 ArtID: ") + artId) + ",
483480 Artwork name: ") + artworkName) + ",
484481 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
485- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
486- let idNFT = calculateAssetId(issueNFT)
487- let sellStatus = if (if ((newAmountSold == maxCanSell))
488- then true
489- else !(isOnSale))
490- then false
491- else true
492- let receiveNFT = if (if (if ((caller == issuer))
493- then (bidOwner != "")
494- else false)
495- then (bidId != "")
496- else false)
497- then addressFromStringValue(bidOwner)
498- else i.caller
499- let assetIdBid = if (!(isDefined(assetId)))
500- then "WAVES"
501- else toBase58String(value(assetId))
502- let bidData = getStringByKey((bidDataKey + "_OPEN"))
503- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
504- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
505- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
506- let soldValue = if (!(isBid))
507- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
508- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
509- let soldData = StringEntry(soldKey, soldValue)
510- let commissionsWithAgent = if ((amountForAgent != 0))
511- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
512- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
513- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
514- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
515- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
516- let txToCaller = if (isSponsored)
517- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
518- else nil
519- let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
520- if (isBid)
521- then [soldData, bidUpdate, bidDelOld] :: buyRes
522- else soldData :: buyRes
523- }
482+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
483+ let idNFT = calculateAssetId(issueNFT)
484+ let sellStatus = if (if ((newAmountSold == maxCanSell))
485+ then true
486+ else !(isOnSale))
487+ then false
488+ else true
489+ let receiveNFT = if (if (if ((caller == issuer))
490+ then (bidOwner != "")
491+ else false)
492+ then (bidId != "")
493+ else false)
494+ then addressFromStringValue(bidOwner)
495+ else i.caller
496+ let assetIdBid = if (!(isDefined(assetId)))
497+ then "WAVES"
498+ else toBase58String(value(assetId))
499+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
500+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
501+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
502+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
503+ let soldValue = if (!(isBid))
504+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
505+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
506+ let soldData = StringEntry(soldKey, soldValue)
507+ let commissionsWithAgent = if ((amountForAgent != 0))
508+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
509+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
510+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
511+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
512+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
513+ let txToCaller = if (isSponsored)
514+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
515+ else nil
516+ let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
517+ if (isBid)
518+ then [soldData, bidUpdate, bidDelOld] :: buyRes
519+ else soldData :: buyRes
524520 }
525521 }
526- }
522+ }
527523 }
528524 }
529525 }
530526 }
531527
532528
533529 func asString (bv) = match bv {
534530 case bv0: String =>
535531 bv0
536532 case _ =>
537533 throw("Sponsored Public Key String expected")
538534 }
539535
540536
541537 @Callable(invoke)
542538 func setConf (key,val) = {
543539 let caller = toString(invoke.caller)
544540 if (containsElement([chris, toString(this)], caller))
545541 then if (contains(key, "conf_"))
546542 then [StringEntry(key, val)]
547543 else throw("Entries starting with conf_ only")
548544 else throw("You are not allowed to change this")
549545 }
550546
551547
552548
553549 @Callable(i)
554550 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
555- let $t02080320876 = idCallerDateSponsored(i, pubKey)
556- let artId = $t02080320876._1
557- let caller = $t02080320876._2
558- let date = $t02080320876._3
559- let isSponsored = $t02080320876._4
560- let $t02088620955 = setLIcence(cidLicence, sha256Licence)
561- let licenceCID = $t02088620955._1
562- let licenceHash = $t02088620955._2
551+ let $t02074820821 = idCallerDateSponsored(i, pubKey)
552+ let artId = $t02074820821._1
553+ let caller = $t02074820821._2
554+ let date = $t02074820821._3
555+ let isSponsored = $t02074820821._4
556+ let $t02083120900 = setLIcence(cidLicence, sha256Licence)
557+ let licenceCID = $t02083120900._1
558+ let licenceHash = $t02083120900._2
563559 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
564560 if ((validateArtwork != ""))
565561 then throw("Something went wrong!")
566562 else {
567563 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
568- let $t02125421342 = if (whitelisted_drop)
564+ let $t02119921287 = if (whitelisted_drop)
569565 then $Tuple2(0, artAssetId)
570566 else validatePayment(i)
571- let amount = $t02125421342._1
572- let assetId = $t02125421342._2
567+ let amount = $t02119921287._1
568+ let assetId = $t02119921287._2
573569 if (!(isDefined(amount)))
574570 then throw("Something went wrong")
575571 else {
576572 let decrease_whitelist_drop = if (whitelisted_drop)
577573 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
578574 else unit
579575 if ((decrease_whitelist_drop == decrease_whitelist_drop))
580576 then {
581577 let txToCaller = if (isSponsored)
582578 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
583579 else nil
584580 ([IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, artAssetId)] ++ txToCaller)
585581 }
586582 else throw("Strict value is not equal to itself.")
587583 }
588584 }
589585 }
590586
591587
592588
593589 @Callable(i)
594590 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
595591 then throw(maintenanceMSG)
596592 else {
597- let $t02325723327 = idCallerDateSponsored(i, pubKey)
598- let id = $t02325723327._1
599- let caller = $t02325723327._2
600- let date = $t02325723327._3
601- let isSponsored = $t02325723327._4
602- let $t02333723406 = setLIcence(cidLicence, sha256Licence)
603- let licenceCID = $t02333723406._1
604- let licenceHash = $t02333723406._2
593+ let $t02320223272 = idCallerDateSponsored(i, pubKey)
594+ let id = $t02320223272._1
595+ let caller = $t02320223272._2
596+ let date = $t02320223272._3
597+ let isSponsored = $t02320223272._4
598+ let $t02328223351 = setLIcence(cidLicence, sha256Licence)
599+ let licenceCID = $t02328223351._1
600+ let licenceHash = $t02328223351._2
605601 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
606602 if ((validateArtwork != ""))
607603 then throw("Something went wrong!")
608604 else {
609605 let entryExist = getStringByKey(keyName(caller, txid))
610606 if ((entryExist == ""))
611607 then throw("Entry not found")
612608 else {
613609 let flag = getStringByKey(keyFlag(caller, txid))
614610 if ((flag == "ILLEGAL"))
615611 then throw("Cannot update ILLEGAL artwork")
616612 else if (!(isArtMinted(caller, txid)))
617613 then {
618614 let txToCaller = if (isSponsored)
619615 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
620616 else nil
621617 ([StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler), IntegerEntry(keyRoyalties(caller, txid), royalties)] ++ txToCaller)
622618 }
623619 else throw("Already minted")
624620 }
625621 }
626622 }
627623
628624
629625
630626 @Callable(i)
631627 func flagArtwork (artId,addr,flag,note) = {
632- let $t02503325067 = idCallerDate(i)
633- let id = $t02503325067._1
634- let caller = $t02503325067._2
628+ let $t02497825012 = idCallerDate(i)
629+ let id = $t02497825012._1
630+ let caller = $t02497825012._2
635631 if (containsElement([chris, toString(this)], caller))
636632 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
637633 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
638634 else throw(("Unknow status " + flag))
639635 else throw("You are not allowed")
640636 }
641637
642638
643639
644640 @Callable(i)
645641 func deleteArtwork (artId,addr) = {
646- let $t02550325537 = idCallerDate(i)
647- let id = $t02550325537._1
648- let caller = $t02550325537._2
642+ let $t02544825482 = idCallerDate(i)
643+ let id = $t02544825482._1
644+ let caller = $t02544825482._2
649645 let addrToUse = if (containsElement([chris, toString(this)], caller))
650646 then addr
651647 else caller
652648 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
653649 if ((entryExist == ""))
654650 then throw("No art matching for this address")
655651 else {
656652 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
657653 let signID = if ((sha256Hash == ""))
658654 then getStringByKey(keySignID(addrToUse, artId))
659655 else ""
660656 let signID_legacy = if ((signID == ""))
661657 then nil
662658 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
663659 let dataToDelete = ([DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))] ++ signID_legacy)
664660 if (!(isArtMinted(addrToUse, artId)))
665661 then if (!(dappRunning))
666662 then throw(maintenanceMSG)
667663 else dataToDelete
668664 else if (containsElement([chris, toString(this)], caller))
669665 then dataToDelete
670666 else throw("Art already minted, you cannot delete it")
671667 }
672668 }
673669
674670
675671
676672 @Callable(i)
677673 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
678- let $t02831628386 = idCallerDateSponsored(i, pubKey)
679- let id = $t02831628386._1
680- let caller = $t02831628386._2
681- let date = $t02831628386._3
682- let isSponsored = $t02831628386._4
674+ let $t02826128331 = idCallerDateSponsored(i, pubKey)
675+ let id = $t02826128331._1
676+ let caller = $t02826128331._2
677+ let date = $t02826128331._3
678+ let isSponsored = $t02826128331._4
683679 let artworkName = getStringByKey(keyName(caller, artId))
684680 if ((artworkName == ""))
685681 then throw("This art doesn't match your account")
686682 else {
687683 let flag = getStringByKey(keyFlag(caller, artId))
688684 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
689685 then throw("Flagged artwork")
690686 else {
691687 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
692688 if ((0 > blockEnd))
693689 then throw("Negative end")
694690 else if (if ((blockEnd > 0))
695691 then if ((maxMint != 1))
696692 then true
697693 else (price != 0)
698694 else false)
699695 then throw("Timed offer only allowed for unique edition and offer only")
700696 else {
701697 let baseHeight = if ((blockEnd == 0))
702698 then 0
703699 else height
704700 if (!(acceptedAssetIds(assetId)))
705701 then throw("Something went wrong!")
706702 else if (!(validateMinSell(price)))
707703 then throw("Something went wrong!")
708704 else {
709705 let checkUser = validateUser(caller)
710706 if ((checkUser != ""))
711707 then throw(checkUser)
712708 else {
713709 let amountSold = getIntegerByKey(keyIssued(caller, artId))
714710 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
715711 if ((maxMint > 100))
716712 then throw("100 editions max per artwork")
717713 else if (if ((amountSold != 0))
718714 then (amountSold == maxCanSell)
719715 else false)
720716 then throw("Max edition reached.")
721717 else if (if ((amountSold > 0))
722718 then (maxCanSell != maxMint)
723719 else false)
724720 then throw("Cannot change maximum issuable anymore")
725721 else if (if ((bidNbr > 0))
726722 then (maxCanSell != maxMint)
727723 else false)
728724 then throw("Cannot change maximum issuable with active orders")
729725 else {
730726 let sellStatus = if (if ((price > 0))
731727 then (maxMint > 0)
732728 else false)
733729 then true
734730 else false
735731 let txToCaller = if (isSponsored)
736732 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
737733 else nil
738734 ([BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))] ++ txToCaller)
739735 }
740736 }
741737 }
742738 }
743739 }
744740 }
745741 }
746742
747743
748744
749745 @Callable(i)
750746 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
751747
752748
753749
754750 @Callable(i)
755751 func setBid (artId,issuer) = {
756- let $t03075930799 = idCallerDate(i)
757- let id = $t03075930799._1
758- let caller = $t03075930799._2
759- let date = $t03075930799._3
760- let $t03080430840 = isPayment(i)
761- let payment = $t03080430840._1
762- let amount = $t03080430840._2
752+ let $t03070430744 = idCallerDate(i)
753+ let id = $t03070430744._1
754+ let caller = $t03070430744._2
755+ let date = $t03070430744._3
756+ let $t03074930785 = isPayment(i)
757+ let payment = $t03074930785._1
758+ let amount = $t03074930785._2
763759 let assetId = if (!(isDefined(payment.assetId)))
764760 then "WAVES"
765761 else toBase58String(value(payment.assetId))
766762 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
767763 if (if ((blockEnd != 0))
768764 then (height >= blockEnd)
769765 else false)
770766 then throw("Sale ended.")
771767 else {
772768 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
773769 if (!(acceptedAssetIds(assetId)))
774770 then throw("asset not accepted")
775771 else if (!(validateMinSell(amount)))
776772 then throw("Wrong min sell")
777773 else {
778774 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
779775 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
780776 if ((0 >= maxCanSell))
781777 then throw("No max edition set for this artwork")
782778 else if ((amountSold >= maxCanSell))
783779 then throw("Sold out, you cannot bid")
784780 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
785781 }
786782 }
787783 }
788784
789785
790786
791787 @Callable(i)
792788 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
793789
794790
795791
796792 @Callable(i)
797793 func cancelBid (artId,issuer,bidId,bidOwner) = {
798- let $t03216432225 = idCallerDate(i)
799- let id = $t03216432225._1
800- let caller = $t03216432225._2
801- let date = $t03216432225._3
794+ let $t03210932170 = idCallerDate(i)
795+ let id = $t03210932170._1
796+ let caller = $t03210932170._2
797+ let date = $t03210932170._3
802798 if (if ((caller != bidOwner))
803799 then (caller != issuer)
804800 else false)
805801 then throw("You cannot do this action")
806802 else {
807803 let returnMoneyTo = if ((caller == issuer))
808804 then bidOwner
809805 else caller
810806 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
811807 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
812808 let bidData = getStringByKey((bidDataKey + "_OPEN"))
813809 if ((bidData == ""))
814810 then throw("Bid not found")
815811 else {
816812 let bidDataArr = split(bidData, "_")
817813 let assetId = getBidAssetId(bidDataArr[0])
818814 let bidStatus = "CANCELED"
819815 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
820816 }
821817 }
822818 }
823819
824820
825821 @Verifier(tx)
826822 func verifier () = match tx {
827823 case inv: InvokeScriptTransaction =>
828824 if (if (if (if ((inv.function == "addArtwork"))
829825 then (inv.dApp == this)
830826 else false)
831827 then (inv.fee == 500000)
832828 else false)
833829 then (inv.feeAssetId == unit)
834830 else false)
835831 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
836832 else if (if (if (if ((inv.function == "updateArtwork"))
837833 then (inv.dApp == this)
838834 else false)
839835 then (inv.fee == 500000)
840836 else false)
841837 then (inv.feeAssetId == unit)
842838 else false)
843839 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
844840 else if (if (if (if ((inv.function == "sellArtwork"))
845841 then (inv.dApp == this)
846842 else false)
847843 then (inv.fee == 500000)
848844 else false)
849845 then (inv.feeAssetId == unit)
850846 else false)
851847 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
852848 else if (if (if (if ((inv.function == "acceptBid"))
853849 then (inv.dApp == this)
854850 else false)
855851 then (inv.fee == 500000)
856852 else false)
857853 then (inv.feeAssetId == unit)
858854 else false)
859855 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
860856 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
861857 case _ =>
862858 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
863859 }
864860

github/deemru/w8io/169f3d6 
117.43 ms