tx · 7SGjFt8UdWjsNxDVKeXW3XxCYuNq4veNSDrpu7agKEoY

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.10.10 07:05 [2792027] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "7SGjFt8UdWjsNxDVKeXW3XxCYuNq4veNSDrpu7agKEoY", "fee": 2600000, "feeAssetId": null, "timestamp": 1696910792006, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "2ofCnCvszed4A87yXEJnUxYtN6JvWVtnDrs719dxHJsFhT5FbFbhwGFCYGP6Mx4kqbkQtSP3d4PGivoR4zoLnLae" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFsAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9wdXp6bGVfYXJ0X3Bvb2wAEXVzZHRQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADmFydEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEQ19QUAAPZWFzdEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X0VBU1QAEXB1enpsZUFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIaY29uZl9hY2NlcHRlZF9hc3NldF9FVEhfUFAAEHdhdmVzQXNzZXRJZF9zdHICBVdBVkVTAA11c2R0UFBBc3NldElkCQDZBAEFEXVzZHRQUEFzc2V0SWRfc3RyAAphcnRBc3NldElkCQDZBAEFDmFydEFzc2V0SWRfc3RyAA11c2RjUFBBc3NldElkCQDZBAEFEXVzZGNQUEFzc2V0SWRfc3RyAAtlYXN0QXNzZXRJZAkA2QQBBQ9lYXN0QXNzZXRJZF9zdHIADXB1enpsZUFzc2V0SWQJANkEAQURcHV6emxlQXNzZXRJZF9zdHIADGV0aFBQQXNzZXRJZAkA2QQBBRBldGhQUEFzc2V0SWRfc3RyAAx3YXZlc0Fzc2V0SWQBAAATYWxsX2FjY2VwdGVkX2Fzc2V0cwkAzAgCBRF1c2R0UFBBc3NldElkX3N0cgkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCBRF1c2RjUFBBc3NldElkX3N0cgkAzAgCBQ9lYXN0QXNzZXRJZF9zdHIJAMwIAgURcHV6emxlQXNzZXRJZF9zdHIJAMwIAgUQd2F2ZXNBc3NldElkX3N0cgkAzAgCBRBldGhQUEFzc2V0SWRfc3RyBQNuaWwABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAOY29tbWlzc2lvbl9mZWUACAAOZGVmYXVsdExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECFGNvbmZfZGVmYXVsdF9saWNlbmNlABJkZWZhdWx0SGFzaExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZGVmYXVsdF9saWNlbmNlX2hhc2gAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAC3VzZXJSZW1vdmVkAgdSRU1PVkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQAC3VzZXJBbGxvd2VkAgdBTExPV0VEABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQACG1pbnRfZmVlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgIJbWludF9mZWVfCQDYBAEFCmFydEFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwEMdmFsaWRhdGVIYXNoAQRoYXNoCQAAAgkAsQIBBQRoYXNoAEABDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEHa2V5RGF0ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGF0ZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5hbWUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25hbWVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlEZXNjAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kZXNjXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RGlzcGxheUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZGlzcGxheV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlFeHBvcnRIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9leHBvcnRfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDGtleUV4cG9ydENpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBCmtleU1heE1pbnQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X3NpZ25pZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleUlzc3VlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfaXNzdWVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5T25TYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyAQ5rZXlMaWNlbmNlSGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhFhcnRfbGljZW5jZV9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5TGljZW5jZUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUYWdzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90YWdzXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VHlwZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdHlwZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5vdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlDcmF3bGVyAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9jcmF3bGVyX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDGtleVJveWFsdGllcwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5RW5kU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfZW5kc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBEmtleUFzc2V0SWRBY2NlcHRlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleUZsYWcCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBcnRpc3RBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgINYXJ0aXN0X2FnZW50XwUKYXJ0aXN0QWRkcgEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBGmtleVByaW1hcnlTaGFyZVB1YmxpY0FnZW50AQphcnRpc3RBZGRyCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBA0kdDAxMDE1NjEwMTkyCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwMTU2MTAxOTICXzEEBmFtb3VudAgFDSR0MDEwMTU2MTAxOTICXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQphcnRBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBA0kdDAxMDc3OTEwODE1CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwNzc5MTA4MTUCXzEEBmFtb3VudAgFDSR0MDEwNzc5MTA4MTUCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAQVwcmljZQMJAGcCAAAFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQDCQECIT0CBQZwdWJLZXkCAAkBC3ZhbHVlT3JFbHNlAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkCCV9mcmVlX3R4cwAAAAAEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQtpc1Nwb25zb3JlZAAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDAwkBAiE9AgUGcHViS2V5AgAJAGYCBQtpc1Nwb25zb3JlZAAABwkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCWCgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFC2lzU3BvbnNvcmVkAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEHYnV5TWludAYBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5BA0kdDAxMzQyMDEzNTA5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDEzNDIwMTM1MDkCXzEEBmNhbGxlcggFDSR0MDEzNDIwMTM1MDkCXzIEBGRhdGUIBQ0kdDAxMzQyMDEzNTA5Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDEzNDIwMTM1MDkCXzQEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHAwMFBWlzQmlkCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyBQhtaW50X2ZlZQkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFCmFydEFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTUwODYxNTI3OAMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNTA4NjE1Mjc4Al8xBAdhc3NldElkCAUNJHQwMTUwODYxNTI3OAJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBBQZpc3N1ZXIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQ5jb21taXNzaW9uX2ZlZQBkBA5hbW91bnRGb3JBZ2VudAMDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFCmFnZW50U2hhcmUAkE4AAAQUYW1vdW50Rm9yUHVibGljQWdlbnQDAwMJAQIhPQIFC3B1YmxpY0FnZW50BQtmZWVSZWNlaXZlcgkAZgIFEHB1YmxpY0FnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BRBwdWJsaWNBZ2VudFNoYXJlAJBOAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFBmlzc3VlcgIKLAogQXJ0SUQ6IAUFYXJ0SWQCESwKIEFydHdvcmsgbmFtZTogBQthcnR3b3JrTmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwGCQEBIQEFCGlzT25TYWxlBwYECnJlY2VpdmVORlQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQhiaWRPd25lcggFAWkGY2FsbGVyBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkRGVsT2xkCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWRVcGRhdGUJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYmlkRGF0YUtleQIHX0NMT1NFRAkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwkA2AQBBQVpZE5GVAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkQmlkAgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBCJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQ1hbW91bnRGb3JTaWduBBFhbW91bnRfYXJ0X2JlZm9yZQkBCmdldEJhbGFuY2UBBQdhc3NldElkAwkAAAIFEWFtb3VudF9hcnRfYmVmb3JlBRFhbW91bnRfYXJ0X2JlZm9yZQQPc3dhcF9mZWVfdG9fYXJ0AwkBAiE9AgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkA/AcECQEHQWRkcmVzcwEJANkEAQUPcHV6emxlX2FydF9wb29sAgRzd2FwCQDMCAIFCmFydEFzc2V0SWQJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFImFtb3VudF9jb21taXNzaW9uX2Zvcl9zaWduX3RvX3N3YXAFA25pbAUEdW5pdAMJAAACBQ9zd2FwX2ZlZV90b19hcnQFD3N3YXBfZmVlX3RvX2FydAQQYW1vdW50X2FydF9hZnRlcgkBCmdldEJhbGFuY2UBBQdhc3NldElkAwkAAAIFEGFtb3VudF9hcnRfYWZ0ZXIFEGFtb3VudF9hcnRfYWZ0ZXIEFGNvbW1pc3Npb25zV2l0aEFnZW50AwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIDCQAAAgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50CQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBWFnZW50BQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUNYW1vdW50Rm9yU2lnbgUHYXNzZXRJZAUDbmlsBBpjb21taXNzaW9uc1dpdGhQdWJsaWNBZ2VudAMJAQIhPQIFFGFtb3VudEZvclB1YmxpY0FnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC3B1YmxpY0FnZW50BRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGaXNzdWVyCQBlAgUQYW1vdW50Rm9yQ3JlYXRvcgUUYW1vdW50Rm9yUHVibGljQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGaXNzdWVyBRBhbW91bnRGb3JDcmVhdG9yBQdhc3NldElkBQNuaWwECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsBAZidXlSZXMJAM4IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwkA2AQBBQVpZE5GVAUHc29sZEtleQkAzAgCCQEMSW50ZWdlckVudHJ5AgIQdG90YWxfbmZ0X2lzc3VlZAkAZAIFCHRvdGFsTkZUAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGaXNzdWVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQpyZWNlaXZlTkZUAAEFBWlkTkZUBQNuaWwFFGNvbW1pc3Npb25zV2l0aEFnZW50BRpjb21taXNzaW9uc1dpdGhQdWJsaWNBZ2VudAUKdHhUb0NhbGxlcgMFBWlzQmlkCQDMCAIFCHNvbGREYXRhCQDMCAIFCWJpZFVwZGF0ZQkAzAgCBQliaWREZWxPbGQFBmJ1eVJlcwkAzAgCBQhzb2xkRGF0YQUGYnV5UmVzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQhhc1N0cmluZwECYnYEByRtYXRjaDAFAmJ2AwkAAQIFByRtYXRjaDACBlN0cmluZwQDYnYwBQckbWF0Y2gwBQNidjAJAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKBmludm9rZQEHc2V0Q29uZgIDa2V5A3ZhbAQGY2FsbGVyCQClCAEIBQZpbnZva2UGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQhjb250YWlucwIFA2tleQIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwFpAQphZGRBcnR3b3JrDARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQQNJHQwMjEwMTIyMTA4NQkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQFYXJ0SWQIBQ0kdDAyMTAxMjIxMDg1Al8xBAZjYWxsZXIIBQ0kdDAyMTAxMjIxMDg1Al8yBARkYXRlCAUNJHQwMjEwMTIyMTA4NQJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyMTAxMjIxMDg1Al80BA0kdDAyMTA5NTIxMTY0CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMTA5NTIxMTY0Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDIxMDk1MjExNjQCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBBB3aGl0ZWxpc3RlZF9kcm9wCQBmAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICBQZjYWxsZXICC19mcmVlX2Ryb3BzAAAEDSR0MDIxNDYzMjE1NTEDBRB3aGl0ZWxpc3RlZF9kcm9wCQCUCgIAAAUKYXJ0QXNzZXRJZAkBD3ZhbGlkYXRlUGF5bWVudAEFAWkEBmFtb3VudAgFDSR0MDIxNDYzMjE1NTECXzEEB2Fzc2V0SWQIBQ0kdDAyMTQ2MzIxNTUxAl8yAwkBASEBCQEJaXNEZWZpbmVkAQUGYW1vdW50CQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcEF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wAwUQd2hpdGVsaXN0ZWRfZHJvcAkA/AcEBQ13aGl0ZWxpc3REYXBwAgt1c2VGcmVlRHJvcAkAzAgCBQZjYWxsZXIFA25pbAUDbmlsBQR1bml0AwkAAAIFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBB2tleURhdGUCBQZjYWxsZXIFBWFydElkBQRkYXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RGVzYwIFBmNhbGxlcgUFYXJ0SWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQVhcnRJZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQVhcnRJZAUJY2lkRXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlFeHBvcnRIYXNoAgUGY2FsbGVyBQVhcnRJZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUFYXJ0SWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQVhcnRJZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VHlwZQIFBmNhbGxlcgUFYXJ0SWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBWFydElkBQR0YWdzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQVhcnRJZAUHY3Jhd2xlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVJveWFsdGllcwIFBmNhbGxlcgUFYXJ0SWQFCXJveWFsdGllcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFBmFtb3VudAUKYXJ0QXNzZXRJZAUDbmlsBQp0eFRvQ2FsbGVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXVwZGF0ZUFydHdvcmsNBHR4aWQEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEDSR0MDIzNDY2MjM1MzYJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMjM0NjYyMzUzNgJfMQQGY2FsbGVyCAUNJHQwMjM0NjYyMzUzNgJfMgQEZGF0ZQgFDSR0MDIzNDY2MjM1MzYCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjM0NjYyMzUzNgJfNAQNJHQwMjM1NDYyMzYxNQkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMjM1NDYyMzYxNQJfMQQLbGljZW5jZUhhc2gIBQ0kdDAyMzU0NjIzNjE1Al8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQKZW50cnlFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBHR4aWQDCQAAAgUKZW50cnlFeGlzdAIACQACAQIPRW50cnkgbm90IGZvdW5kBARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5RmxhZwIFBmNhbGxlcgUEdHhpZAMJAAACBQRmbGFnAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQtpc0FydE1pbnRlZAIFBmNhbGxlcgUEdHhpZAQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RGVzYwIFBmNhbGxlcgUEdHhpZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBHR4aWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUEdHhpZAUJY2lkRXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlFeHBvcnRIYXNoAgUGY2FsbGVyBQR0eGlkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBHR4aWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQR0eGlkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUEdHhpZAUEdGFncwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VHlwZQIFBmNhbGxlcgUEdHhpZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUEdHhpZAUHY3Jhd2xlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVJveWFsdGllcwIFBmNhbGxlcgUEdHhpZAUJcm95YWx0aWVzBQNuaWwFCnR4VG9DYWxsZXIJAAIBAg5BbHJlYWR5IG1pbnRlZAFpAQtmbGFnQXJ0d29yawQFYXJ0SWQEYWRkcgRmbGFnBG5vdGUEDSR0MDI1MjQyMjUyNzYJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI1MjQyMjUyNzYCXzEEBmNhbGxlcggFDSR0MDI1MjQyMjUyNzYCXzIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIHQ09OU0VOVAkAzAgCAgAJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlGbGFnAgUEYWRkcgUFYXJ0SWQFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5vdGUCBQRhZGRyBQVhcnRJZAUEbm90ZQUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUEZmxhZwkAAgECE1lvdSBhcmUgbm90IGFsbG93ZWQBaQENZGVsZXRlQXJ0d29yawIFYXJ0SWQEYWRkcgQNJHQwMjU3MTIyNTc0NgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjU3MTIyNTc0NgJfMQQGY2FsbGVyCAUNJHQwMjU3MTIyNTc0NgJfMgQJYWRkclRvVXNlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUEYWRkcgUGY2FsbGVyBAplbnRyeUV4aXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MDCQAAAgUKZW50cnlFeGlzdAIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MECnNoYTI1Nkhhc2gJAQ5nZXRTdHJpbmdCeUtleQEJARFrZXlIYXNoQnlUeGlkQWRkcgIFCWFkZHJUb1VzZQUFYXJ0SWQEBnNpZ25JRAMJAAACBQpzaGEyNTZIYXNoAgAJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkAgAEDXNpZ25JRF9sZWdhY3kDCQAAAgUGc2lnbklEAgAFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5aWRCeVNpZ25pZAIFCWFkZHJUb1VzZQUGc2lnbklEBQNuaWwEDGRhdGFUb0RlbGV0ZQkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEYXRlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURlc2MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlEaXNwbGF5Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXhwb3J0Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RXhwb3J0SGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleUxpY2VuY2VIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5TGljZW5jZUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVR5cGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUYWdzAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5TWF4TWludAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleU9uU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleUZsYWcCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQhrZXlQcmljZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5RW5kU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5vdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlDcmF3bGVyAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5Um95YWx0aWVzAgUJYWRkclRvVXNlBQVhcnRJZAUDbmlsBQ1zaWduSURfbGVnYWN5AwkBASEBCQELaXNBcnRNaW50ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBQxkYXRhVG9EZWxldGUDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQxkYXRhVG9EZWxldGUJAAIBAihBcnQgYWxyZWFkeSBtaW50ZWQsIHlvdSBjYW5ub3QgZGVsZXRlIGl0AWkBC3NlbGxBcnR3b3JrBgVhcnRJZAVwcmljZQdtYXhNaW50B2Fzc2V0SWQIYmxvY2tFbmQGcHViS2V5BA0kdDAyODUyNTI4NTk1CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDI4NTI1Mjg1OTUCXzEEBmNhbGxlcggFDSR0MDI4NTI1Mjg1OTUCXzIEBGRhdGUIBQ0kdDAyODUyNTI4NTk1Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDI4NTI1Mjg1OTUCXzQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECI1RoaXMgYXJ0IGRvZXNuJ3QgbWF0Y2ggeW91ciBhY2NvdW50BARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5RmxhZwIFBmNhbGxlcgUFYXJ0SWQDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAAIBAg9GbGFnZ2VkIGFydHdvcmsEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAGYCAAAFCGJsb2NrRW5kCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQhibG9ja0VuZAAAAwkBAiE9AgUHbWF4TWludAABBgkBAiE9AgUFcHJpY2UAAAcJAAIBAjpUaW1lZCBvZmZlciBvbmx5IGFsbG93ZWQgZm9yIHVuaXF1ZSBlZGl0aW9uIGFuZCBvZmZlciBvbmx5BApiYXNlSGVpZ2h0AwkAAAIFCGJsb2NrRW5kAAAAAAUGaGVpZ2h0AwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFB2Fzc2V0SWQJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwBBQVwcmljZQkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAMJAGYCBQdtYXhNaW50AGQJAAIBAhwxMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrAwMJAQIhPQIFCmFtb3VudFNvbGQAAAkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwHCQACAQIUTWF4IGVkaXRpb24gcmVhY2hlZC4DAwkAZgIFCmFtb3VudFNvbGQAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAiZDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgYW55bW9yZQMDCQBmAgUGYmlkTmJyAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQIxQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIHdpdGggYWN0aXZlIG9yZGVycwQKc2VsbFN0YXR1cwMDCQBmAgUFcHJpY2UAAAkAZgIFB21heE1pbnQAAAcGBwQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQhrZXlQcmljZQIFBmNhbGxlcgUFYXJ0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFB21heE1pbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmNhbGxlcgUFYXJ0SWQFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAkAZAIFCmJhc2VIZWlnaHQFCGJsb2NrRW5kBQNuaWwFCnR4VG9DYWxsZXIBaQEKYnV5QXJ0d29yawIFYXJ0SWQGaXNzdWVyCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXICAAIAAgABaQEGc2V0QmlkAgVhcnRJZAZpc3N1ZXIEDSR0MDMwOTY4MzEwMDgJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMwOTY4MzEwMDgCXzEEBmNhbGxlcggFDSR0MDMwOTY4MzEwMDgCXzIEBGRhdGUIBQ0kdDAzMDk2ODMxMDA4Al8zBA0kdDAzMTAxMzMxMDQ5CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDMxMDEzMzEwNDkCXzEEBmFtb3VudAgFDSR0MDMxMDEzMzEwNDkCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGaXNzdWVyBQVhcnRJZAMDCQECIT0CBQhibG9ja0VuZAAACQBnAgUGaGVpZ2h0BQhibG9ja0VuZAcJAAIBAgtTYWxlIGVuZGVkLgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkAwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFB2Fzc2V0SWQJAAIBAhJhc3NldCBub3QgYWNjZXB0ZWQDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwBBQZhbW91bnQJAAIBAg5Xcm9uZyBtaW4gc2VsbAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwkAZwIAAAUKbWF4Q2FuU2VsbAkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAhhTb2xkIG91dCwgeW91IGNhbm5vdCBiaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUCaWQCBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIFB2Fzc2V0SWQCAV8JAKQDAQUGYW1vdW50AgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZAIFBmJpZE5icgABBQNuaWwBaQEJYWNjZXB0QmlkBQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5CQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgUGcHViS2V5AWkBCWNhbmNlbEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMjM3MzMyNDM0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMjM3MzMyNDM0Al8xBAZjYWxsZXIIBQ0kdDAzMjM3MzMyNDM0Al8yBARkYXRlCAUNJHQwMzIzNzMzMjQzNAJfMwMDCQECIT0CBQZjYWxsZXIFCGJpZE93bmVyCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBA1yZXR1cm5Nb25leVRvAwkAAAIFBmNhbGxlcgUGaXNzdWVyBQhiaWRPd25lcgUGY2FsbGVyBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQHYXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAQJYmlkU3RhdHVzAghDQU5DRUxFRAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQpiaWREYXRhS2V5AgFfBQliaWRTdGF0dXMJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZQIFBmJpZE5icgABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ1yZXR1cm5Nb25leVRvCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBAnR4AQh2ZXJpZmllcgAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADAwMDCQAAAggFA2ludghmdW5jdGlvbgIKYWRkQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwALAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CDXVwZGF0ZUFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MADAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAFAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CCWFjY2VwdEJpZAkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkAyBMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAECQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5MZ7geA==", "height": 2792027, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3irL3BVg5nudAZhzRZ69UzmuhZaY2KSf5EKESMF9JkUy Next: 4sQo1xfwtxirzxn6fnK3d1WLeJ37xdvHUKv4ByziZGza Diff:
OldNewDifferences
1919 else value(addressFromString(getStringByKey("conf_users_dapp")))
2020
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
22+
23+let puzzle_art_pool = getStringByKey("conf_puzzle_art_pool")
2224
2325 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2426
272274
273275
274276 func validatePayment (i) = {
275- let $t01009510131 = isPayment(i)
276- let payment = $t01009510131._1
277- let amount = $t01009510131._2
277+ let $t01015610192 = isPayment(i)
278+ let payment = $t01015610192._1
279+ let amount = $t01015610192._2
278280 let assetId = if (if (isDefined(payment.assetId))
279281 then (payment.assetId == artAssetId)
280282 else false)
297299
298300
299301 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
300- let $t01071810754 = isPayment(i)
301- let payment = $t01071810754._1
302- let amount = $t01071810754._2
302+ let $t01077910815 = isPayment(i)
303+ let payment = $t01077910815._1
304+ let amount = $t01077910815._2
303305 let assetId = if (!(isDefined(payment.assetId)))
304306 then unit
305307 else if (if ((size(priceAssetId) > 0))
383385
384386
385387 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
386- let $t01335913448 = idCallerDateSponsored(i, pubKey)
387- let id = $t01335913448._1
388- let caller = $t01335913448._2
389- let date = $t01335913448._3
390- let isSponsored = $t01335913448._4
388+ let $t01342013509 = idCallerDateSponsored(i, pubKey)
389+ let id = $t01342013509._1
390+ let caller = $t01342013509._2
391+ let date = $t01342013509._3
392+ let isSponsored = $t01342013509._4
391393 let isBid = if (if (if ((caller == issuer))
392394 then (bidOwner != "")
393395 else false)
447449 then throw(checkUser)
448450 else {
449451 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
450- let $t01502515217 = if (isBid)
452+ let $t01508615278 = if (isBid)
451453 then getPriceAssetIdFromBid(bidDataKey)
452454 else validatePriceAssetId(i, priceAssetId, artworkPrice)
453- let amount = $t01502515217._1
454- let assetId = $t01502515217._2
455+ let amount = $t01508615278._1
456+ let assetId = $t01508615278._2
455457 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
456458 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
457459 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
506508 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
507509 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
508510 let soldData = StringEntry(soldKey, soldValue)
509- let commissionsWithAgent = if ((amountForAgent != 0))
510- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
511- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
512- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
513- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
514- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
515- let txToCaller = if (isSponsored)
516- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
517- else nil
518- 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)
519- if (isBid)
520- then [soldData, bidUpdate, bidDelOld] :: buyRes
521- else soldData :: buyRes
511+ let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
512+ then (amountForSign - amountForAgent)
513+ else amountForSign
514+ let amount_art_before = getBalance(assetId)
515+ if ((amount_art_before == amount_art_before))
516+ then {
517+ let swap_fee_to_art = if ((assetId != artAssetId))
518+ then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
519+ else unit
520+ if ((swap_fee_to_art == swap_fee_to_art))
521+ then {
522+ let amount_art_after = getBalance(assetId)
523+ if ((amount_art_after == amount_art_after))
524+ then {
525+ let commissionsWithAgent = if ((amountForAgent != 0))
526+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527+ then (amountForSign - amountForAgent)
528+ else (amount_art_after - amount_art_before), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
530+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
531+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
532+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
533+ let txToCaller = if (isSponsored)
534+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
535+ else nil
536+ 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)
537+ if (isBid)
538+ then [soldData, bidUpdate, bidDelOld] :: buyRes
539+ else soldData :: buyRes
540+ }
541+ else throw("Strict value is not equal to itself.")
542+ }
543+ else throw("Strict value is not equal to itself.")
544+ }
545+ else throw("Strict value is not equal to itself.")
522546 }
523547 }
524548 }
550574
551575 @Callable(i)
552576 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
553- let $t02080820881 = idCallerDateSponsored(i, pubKey)
554- let artId = $t02080820881._1
555- let caller = $t02080820881._2
556- let date = $t02080820881._3
557- let isSponsored = $t02080820881._4
558- let $t02089120960 = setLIcence(cidLicence, sha256Licence)
559- let licenceCID = $t02089120960._1
560- let licenceHash = $t02089120960._2
577+ let $t02101221085 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02101221085._1
579+ let caller = $t02101221085._2
580+ let date = $t02101221085._3
581+ let isSponsored = $t02101221085._4
582+ let $t02109521164 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t02109521164._1
584+ let licenceHash = $t02109521164._2
561585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
562586 if ((validateArtwork != ""))
563587 then throw("Something went wrong!")
564588 else {
565589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
566- let $t02125921347 = if (whitelisted_drop)
590+ let $t02146321551 = if (whitelisted_drop)
567591 then $Tuple2(0, artAssetId)
568592 else validatePayment(i)
569- let amount = $t02125921347._1
570- let assetId = $t02125921347._2
593+ let amount = $t02146321551._1
594+ let assetId = $t02146321551._2
571595 if (!(isDefined(amount)))
572596 then throw("Something went wrong")
573597 else {
592616 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
593617 then throw(maintenanceMSG)
594618 else {
595- let $t02326223332 = idCallerDateSponsored(i, pubKey)
596- let id = $t02326223332._1
597- let caller = $t02326223332._2
598- let date = $t02326223332._3
599- let isSponsored = $t02326223332._4
600- let $t02334223411 = setLIcence(cidLicence, sha256Licence)
601- let licenceCID = $t02334223411._1
602- let licenceHash = $t02334223411._2
619+ let $t02346623536 = idCallerDateSponsored(i, pubKey)
620+ let id = $t02346623536._1
621+ let caller = $t02346623536._2
622+ let date = $t02346623536._3
623+ let isSponsored = $t02346623536._4
624+ let $t02354623615 = setLIcence(cidLicence, sha256Licence)
625+ let licenceCID = $t02354623615._1
626+ let licenceHash = $t02354623615._2
603627 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
604628 if ((validateArtwork != ""))
605629 then throw("Something went wrong!")
627651
628652 @Callable(i)
629653 func flagArtwork (artId,addr,flag,note) = {
630- let $t02503825072 = idCallerDate(i)
631- let id = $t02503825072._1
632- let caller = $t02503825072._2
654+ let $t02524225276 = idCallerDate(i)
655+ let id = $t02524225276._1
656+ let caller = $t02524225276._2
633657 if (containsElement([chris, toString(this)], caller))
634658 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
635659 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
641665
642666 @Callable(i)
643667 func deleteArtwork (artId,addr) = {
644- let $t02550825542 = idCallerDate(i)
645- let id = $t02550825542._1
646- let caller = $t02550825542._2
668+ let $t02571225746 = idCallerDate(i)
669+ let id = $t02571225746._1
670+ let caller = $t02571225746._2
647671 let addrToUse = if (containsElement([chris, toString(this)], caller))
648672 then addr
649673 else caller
673697
674698 @Callable(i)
675699 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
676- let $t02832128391 = idCallerDateSponsored(i, pubKey)
677- let id = $t02832128391._1
678- let caller = $t02832128391._2
679- let date = $t02832128391._3
680- let isSponsored = $t02832128391._4
700+ let $t02852528595 = idCallerDateSponsored(i, pubKey)
701+ let id = $t02852528595._1
702+ let caller = $t02852528595._2
703+ let date = $t02852528595._3
704+ let isSponsored = $t02852528595._4
681705 let artworkName = getStringByKey(keyName(caller, artId))
682706 if ((artworkName == ""))
683707 then throw("This art doesn't match your account")
751775
752776 @Callable(i)
753777 func setBid (artId,issuer) = {
754- let $t03076430804 = idCallerDate(i)
755- let id = $t03076430804._1
756- let caller = $t03076430804._2
757- let date = $t03076430804._3
758- let $t03080930845 = isPayment(i)
759- let payment = $t03080930845._1
760- let amount = $t03080930845._2
778+ let $t03096831008 = idCallerDate(i)
779+ let id = $t03096831008._1
780+ let caller = $t03096831008._2
781+ let date = $t03096831008._3
782+ let $t03101331049 = isPayment(i)
783+ let payment = $t03101331049._1
784+ let amount = $t03101331049._2
761785 let assetId = if (!(isDefined(payment.assetId)))
762786 then "WAVES"
763787 else toBase58String(value(payment.assetId))
793817
794818 @Callable(i)
795819 func cancelBid (artId,issuer,bidId,bidOwner) = {
796- let $t03216932230 = idCallerDate(i)
797- let id = $t03216932230._1
798- let caller = $t03216932230._2
799- let date = $t03216932230._3
820+ let $t03237332434 = idCallerDate(i)
821+ let id = $t03237332434._1
822+ let caller = $t03237332434._2
823+ let date = $t03237332434._3
800824 if (if ((caller != bidOwner))
801825 then (caller != issuer)
802826 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")))
22+
23+let puzzle_art_pool = getStringByKey("conf_puzzle_art_pool")
2224
2325 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2426
2527 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
2628
2729 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
2830
2931 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3032
3133 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3234
3335 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3436
3537 let wavesAssetId_str = "WAVES"
3638
3739 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
3840
3941 let artAssetId = fromBase58String(artAssetId_str)
4042
4143 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4244
4345 let eastAssetId = fromBase58String(eastAssetId_str)
4446
4547 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
4648
4749 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
4850
4951 let wavesAssetId = base58''
5052
5153 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5254
5355 let chris = getStringByKey("conf_admin_1")
5456
5557 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5658
5759
5860 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5961
6062
6163 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6264
6365
6466 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6567
6668
6769 let commission_fee = 8
6870
6971 let defaultLicence = getStringByKey("conf_default_licence")
7072
7173 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7274
7375 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7476
7577 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
7678
7779 let userSuspended = "SUSPENDED"
7880
7981 let userRemoved = "REMOVED"
8082
8183 let userUnregistered = "UNREGISTERED"
8284
8385 let userAllowed = "ALLOWED"
8486
8587 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
8688
8789 let mint_fee = getIntegerByKeyFromOracle(("mint_fee_" + toBase58String(artAssetId)))
8890
8991 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
9092
9193
9294 func validateCID (cid) = if (contains(cid, "/"))
9395 then if (if ((76 > size(cid)))
9496 then (size(split(cid, "/")[0]) == 59)
9597 else false)
9698 then (16 > size(split(cid, "/")[1]))
9799 else false
98100 else false
99101
100102
101103 func validateHash (hash) = (size(hash) == 64)
102104
103105
104106 func keyUserStatus (caller) = ("user_status_" + caller)
105107
106108
107109 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
108110
109111
110112 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
111113
112114
113115 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
114116
115117
116118 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
117119
118120
119121 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
120122
121123
122124 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
123125
124126
125127 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
126128
127129
128130 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
129131
130132
131133 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
132134
133135
134136 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
135137
136138
137139 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
138140
139141
140142 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
141143
142144
143145 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
144146
145147
146148 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
147149
148150
149151 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
150152
151153
152154 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
153155
154156
155157 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
156158
157159
158160 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
159161
160162
161163 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
162164
163165
164166 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
165167
166168
167169 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
168170
169171
170172 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
171173
172174
173175 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
174176
175177
176178 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
177179
178180
179181 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
180182
181183
182184 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
183185
184186
185187 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
186188
187189
188190 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
189191
190192
191193 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
192194 then throw("Wrong Display CID")
193195 else if (!(validateCID(cidExport)))
194196 then throw("Wrong Export CID")
195197 else if (if ((cidLicence != ""))
196198 then !(validateCID(cidLicence))
197199 else false)
198200 then throw("Wrong Licence CID")
199201 else true
200202
201203
202204 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
203205 then throw("Export Hash 64 char. max")
204206 else if (!(validateHash(sha256Licence)))
205207 then throw("Licence Hash 64 char. max")
206208 else true
207209
208210
209211 func validateString (str,max) = if ((size(str) == 0))
210212 then throw("Field cannot be is empty")
211213 else if ((size(str) > max))
212214 then throw((str + " is too long"))
213215 else true
214216
215217
216218 func validateUser (caller) = {
217219 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
218220 if (if ((userStatus == userUnregistered))
219221 then true
220222 else (userStatus == userAllowed))
221223 then "Register this account first with \"Account\" tab"
222224 else if ((userStatus == userSuspended))
223225 then "Account suspended"
224226 else if ((userStatus == userRemoved))
225227 then "Account removed"
226228 else ""
227229 }
228230
229231
230232 func setLIcence (cidLicence,sha256Licence) = {
231233 let cid = if ((size(cidLicence) == 0))
232234 then defaultLicence
233235 else cidLicence
234236 let hash = if ((size(sha256Licence) == 0))
235237 then defaultHashLicence
236238 else sha256Licence
237239 $Tuple2(cid, hash)
238240 }
239241
240242
241243 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
242244 let checkUser = validateUser(caller)
243245 if ((checkUser != ""))
244246 then throw(checkUser)
245247 else if ((size(cidDisplay) == 0))
246248 then throw("Display CID cannot be empty")
247249 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
248250 then throw("Problem with CID")
249251 else if (!(validateAllHash(sha256Export, licenceHash)))
250252 then throw("Problem with Hashes")
251253 else if (!(validateString(name, 100)))
252254 then throw("100 Char. max name")
253255 else if (!(validateString(description, 1000)))
254256 then throw("1000 Char. max description")
255257 else if (if ((0 > royalties))
256258 then true
257259 else (royalties > 1000))
258260 then throw("Royalties cannot be less than 0% or higher than 10%")
259261 else if ((size(split(tags, ",")) > 5))
260262 then throw("5 tags max.")
261263 else ""
262264 }
263265
264266
265267 func isPayment (i) = if ((size(i.payments) == 0))
266268 then throw("No payment attached")
267269 else {
268270 let payment = value(i.payments[0])
269271 let amount = value(payment.amount)
270272 $Tuple2(payment, amount)
271273 }
272274
273275
274276 func validatePayment (i) = {
275- let $t01009510131 = isPayment(i)
276- let payment = $t01009510131._1
277- let amount = $t01009510131._2
277+ let $t01015610192 = isPayment(i)
278+ let payment = $t01015610192._1
279+ let amount = $t01015610192._2
278280 let assetId = if (if (isDefined(payment.assetId))
279281 then (payment.assetId == artAssetId)
280282 else false)
281283 then payment.assetId
282284 else throw("Only SIGN token accepted as transaction fee")
283285 if ((amount != currentCertificationPrice))
284286 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
285287 else $Tuple2(amount, assetId)
286288 }
287289
288290
289291 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
290292 case b: Int =>
291293 if ((b != 0))
292294 then true
293295 else false
294296 case _ =>
295297 false
296298 }
297299
298300
299301 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
300- let $t01071810754 = isPayment(i)
301- let payment = $t01071810754._1
302- let amount = $t01071810754._2
302+ let $t01077910815 = isPayment(i)
303+ let payment = $t01077910815._1
304+ let amount = $t01077910815._2
303305 let assetId = if (!(isDefined(payment.assetId)))
304306 then unit
305307 else if (if ((size(priceAssetId) > 0))
306308 then (toBase58String(value(payment.assetId)) == priceAssetId)
307309 else false)
308310 then payment.assetId
309311 else throw("Wrong asset id")
310312 if (if ((assetId == unit))
311313 then (priceAssetId != "")
312314 else false)
313315 then throw("Wrong asset id")
314316 else if ((artworkPrice != amount))
315317 then throw("Payment don't match")
316318 else $Tuple2(amount, assetId)
317319 }
318320
319321
320322 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
321323 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
322324 else true
323325
324326
325327 func validateMinSell (price) = if ((0 >= price))
326328 then throw("Wrong minimum sell price")
327329 else true
328330
329331
330332 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
331333 then unit
332334 else fromBase58String(assetId)
333335
334336
335337 func getPriceAssetIdFromBid (bidDataKey) = {
336338 let bidData = getStringByKey((bidDataKey + "_OPEN"))
337339 if ((bidData == ""))
338340 then throw("Bid not found")
339341 else {
340342 let bidDataArr = split(bidData, "_")
341343 let bidAmount = parseIntValue(bidDataArr[1])
342344 let bidAssetId = getBidAssetId(bidDataArr[0])
343345 if ((0 >= bidAmount))
344346 then throw("Wrong amount")
345347 else $Tuple2(bidAmount, bidAssetId)
346348 }
347349 }
348350
349351
350352 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
351353 then throw(maintenanceMSG)
352354 else {
353355 let isSponsored = if ((pubKey != ""))
354356 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
355357 else 0
356358 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
357359 then (isSponsored > 0)
358360 else false)
359361 then toString(addressFromPublicKey(fromBase58String(pubKey)))
360362 else toBase58String(i.caller.bytes)
361363 let get_sponsored_waves = if (if ((pubKey != ""))
362364 then (isSponsored > 0)
363365 else false)
364366 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
365367 else unit
366368 if ((get_sponsored_waves == get_sponsored_waves))
367369 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
368370 else throw("Strict value is not equal to itself.")
369371 }
370372
371373
372374 func idCallerDate (i) = if (!(dappRunning))
373375 then throw(maintenanceMSG)
374376 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
375377
376378
377379 func getBalance (assetId) = match assetId {
378380 case b: ByteVector =>
379381 assetBalance(this, b)
380382 case _ =>
381383 wavesBalance(this).available
382384 }
383385
384386
385387 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
386- let $t01335913448 = idCallerDateSponsored(i, pubKey)
387- let id = $t01335913448._1
388- let caller = $t01335913448._2
389- let date = $t01335913448._3
390- let isSponsored = $t01335913448._4
388+ let $t01342013509 = idCallerDateSponsored(i, pubKey)
389+ let id = $t01342013509._1
390+ let caller = $t01342013509._2
391+ let date = $t01342013509._3
392+ let isSponsored = $t01342013509._4
391393 let isBid = if (if (if ((caller == issuer))
392394 then (bidOwner != "")
393395 else false)
394396 then (bidId != "")
395397 else false)
396398 then true
397399 else false
398400 if (if (isBid)
399401 then (caller != issuer)
400402 else false)
401403 then throw("You cannot do this action")
402404 else {
403405 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
404406 if (if (if ((blockEnd != 0))
405407 then (height >= blockEnd)
406408 else false)
407409 then !(isBid)
408410 else false)
409411 then throw("Sale ended.")
410412 else {
411413 let callerIsIssuer = (caller == issuer)
412414 let totalNFT = getIntegerByKey("total_nft_issued")
413415 let artworkName = getStringByKey(keyName(issuer, artId))
414416 if ((artworkName == ""))
415417 then throw("Art doesn't exist")
416418 else {
417419 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
418420 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
419421 let artworkPrice = if (callerIsIssuer)
420422 then mint_fee
421423 else getIntegerByKey(keyPrice(issuer, artId))
422424 let priceAssetId = if (callerIsIssuer)
423425 then toBase58String(artAssetId)
424426 else getStringByKey(keyAssetIdAccepted(issuer, artId))
425427 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
426428 if (if (if (!(isBid))
427429 then !(callerIsIssuer)
428430 else false)
429431 then if (if ((0 >= artworkPrice))
430432 then true
431433 else !(isOnSale))
432434 then true
433435 else (0 >= maxCanSell)
434436 else false)
435437 then throw("Art not for sale")
436438 else if (if (if (!(isBid))
437439 then callerIsIssuer
438440 else false)
439441 then (0 >= maxCanSell)
440442 else false)
441443 then throw("Max issuable not set")
442444 else {
443445 let checkUser = validateUser(issuer)
444446 if (if (isBid)
445447 then (checkUser != "")
446448 else false)
447449 then throw(checkUser)
448450 else {
449451 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
450- let $t01502515217 = if (isBid)
452+ let $t01508615278 = if (isBid)
451453 then getPriceAssetIdFromBid(bidDataKey)
452454 else validatePriceAssetId(i, priceAssetId, artworkPrice)
453- let amount = $t01502515217._1
454- let assetId = $t01502515217._2
455+ let amount = $t01508615278._1
456+ let assetId = $t01508615278._2
455457 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
456458 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
457459 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
458460 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
459461 let isWhitelisted = checkWhitelist(issuer)
460462 let amountForSign = fraction(amount, commission_fee, 100)
461463 let amountForAgent = if (if (if ((agent != feeReceiver))
462464 then (agentShare > 0)
463465 else false)
464466 then (height > isWhitelisted)
465467 else false)
466468 then fraction(amount, agentShare, 10000)
467469 else 0
468470 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
469471 then (publicAgentShare > 0)
470472 else false)
471473 then (height > isWhitelisted)
472474 else false)
473475 then fraction(amount, publicAgentShare, 10000)
474476 else 0
475477 let amountForCreator = (amount - amountForSign)
476478 if ((amountSold == maxCanSell))
477479 then throw("Art sold out")
478480 else {
479481 let newAmountSold = (amountSold + 1)
480482 let issueMeta = ((((((((("Creator: " + issuer) + ",
481483 ArtID: ") + artId) + ",
482484 Artwork name: ") + artworkName) + ",
483485 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
484486 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
485487 let idNFT = calculateAssetId(issueNFT)
486488 let sellStatus = if (if ((newAmountSold == maxCanSell))
487489 then true
488490 else !(isOnSale))
489491 then false
490492 else true
491493 let receiveNFT = if (if (if ((caller == issuer))
492494 then (bidOwner != "")
493495 else false)
494496 then (bidId != "")
495497 else false)
496498 then addressFromStringValue(bidOwner)
497499 else i.caller
498500 let assetIdBid = if (!(isDefined(assetId)))
499501 then "WAVES"
500502 else toBase58String(value(assetId))
501503 let bidData = getStringByKey((bidDataKey + "_OPEN"))
502504 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
503505 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
504506 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
505507 let soldValue = if (!(isBid))
506508 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
507509 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
508510 let soldData = StringEntry(soldKey, soldValue)
509- let commissionsWithAgent = if ((amountForAgent != 0))
510- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
511- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
512- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
513- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
514- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
515- let txToCaller = if (isSponsored)
516- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
517- else nil
518- 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)
519- if (isBid)
520- then [soldData, bidUpdate, bidDelOld] :: buyRes
521- else soldData :: buyRes
511+ let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
512+ then (amountForSign - amountForAgent)
513+ else amountForSign
514+ let amount_art_before = getBalance(assetId)
515+ if ((amount_art_before == amount_art_before))
516+ then {
517+ let swap_fee_to_art = if ((assetId != artAssetId))
518+ then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
519+ else unit
520+ if ((swap_fee_to_art == swap_fee_to_art))
521+ then {
522+ let amount_art_after = getBalance(assetId)
523+ if ((amount_art_after == amount_art_after))
524+ then {
525+ let commissionsWithAgent = if ((amountForAgent != 0))
526+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527+ then (amountForSign - amountForAgent)
528+ else (amount_art_after - amount_art_before), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
530+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
531+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
532+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
533+ let txToCaller = if (isSponsored)
534+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
535+ else nil
536+ 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)
537+ if (isBid)
538+ then [soldData, bidUpdate, bidDelOld] :: buyRes
539+ else soldData :: buyRes
540+ }
541+ else throw("Strict value is not equal to itself.")
542+ }
543+ else throw("Strict value is not equal to itself.")
544+ }
545+ else throw("Strict value is not equal to itself.")
522546 }
523547 }
524548 }
525549 }
526550 }
527551 }
528552 }
529553
530554
531555 func asString (bv) = match bv {
532556 case bv0: String =>
533557 bv0
534558 case _ =>
535559 throw("Sponsored Public Key String expected")
536560 }
537561
538562
539563 @Callable(invoke)
540564 func setConf (key,val) = {
541565 let caller = toString(invoke.caller)
542566 if (containsElement([chris, toString(this)], caller))
543567 then if (contains(key, "conf_"))
544568 then [StringEntry(key, val)]
545569 else throw("Entries starting with conf_ only")
546570 else throw("You are not allowed to change this")
547571 }
548572
549573
550574
551575 @Callable(i)
552576 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
553- let $t02080820881 = idCallerDateSponsored(i, pubKey)
554- let artId = $t02080820881._1
555- let caller = $t02080820881._2
556- let date = $t02080820881._3
557- let isSponsored = $t02080820881._4
558- let $t02089120960 = setLIcence(cidLicence, sha256Licence)
559- let licenceCID = $t02089120960._1
560- let licenceHash = $t02089120960._2
577+ let $t02101221085 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02101221085._1
579+ let caller = $t02101221085._2
580+ let date = $t02101221085._3
581+ let isSponsored = $t02101221085._4
582+ let $t02109521164 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t02109521164._1
584+ let licenceHash = $t02109521164._2
561585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
562586 if ((validateArtwork != ""))
563587 then throw("Something went wrong!")
564588 else {
565589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
566- let $t02125921347 = if (whitelisted_drop)
590+ let $t02146321551 = if (whitelisted_drop)
567591 then $Tuple2(0, artAssetId)
568592 else validatePayment(i)
569- let amount = $t02125921347._1
570- let assetId = $t02125921347._2
593+ let amount = $t02146321551._1
594+ let assetId = $t02146321551._2
571595 if (!(isDefined(amount)))
572596 then throw("Something went wrong")
573597 else {
574598 let decrease_whitelist_drop = if (whitelisted_drop)
575599 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
576600 else unit
577601 if ((decrease_whitelist_drop == decrease_whitelist_drop))
578602 then {
579603 let txToCaller = if (isSponsored)
580604 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
581605 else nil
582606 ([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)
583607 }
584608 else throw("Strict value is not equal to itself.")
585609 }
586610 }
587611 }
588612
589613
590614
591615 @Callable(i)
592616 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
593617 then throw(maintenanceMSG)
594618 else {
595- let $t02326223332 = idCallerDateSponsored(i, pubKey)
596- let id = $t02326223332._1
597- let caller = $t02326223332._2
598- let date = $t02326223332._3
599- let isSponsored = $t02326223332._4
600- let $t02334223411 = setLIcence(cidLicence, sha256Licence)
601- let licenceCID = $t02334223411._1
602- let licenceHash = $t02334223411._2
619+ let $t02346623536 = idCallerDateSponsored(i, pubKey)
620+ let id = $t02346623536._1
621+ let caller = $t02346623536._2
622+ let date = $t02346623536._3
623+ let isSponsored = $t02346623536._4
624+ let $t02354623615 = setLIcence(cidLicence, sha256Licence)
625+ let licenceCID = $t02354623615._1
626+ let licenceHash = $t02354623615._2
603627 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
604628 if ((validateArtwork != ""))
605629 then throw("Something went wrong!")
606630 else {
607631 let entryExist = getStringByKey(keyName(caller, txid))
608632 if ((entryExist == ""))
609633 then throw("Entry not found")
610634 else {
611635 let flag = getStringByKey(keyFlag(caller, txid))
612636 if ((flag == "ILLEGAL"))
613637 then throw("Cannot update ILLEGAL artwork")
614638 else if (!(isArtMinted(caller, txid)))
615639 then {
616640 let txToCaller = if (isSponsored)
617641 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
618642 else nil
619643 ([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)
620644 }
621645 else throw("Already minted")
622646 }
623647 }
624648 }
625649
626650
627651
628652 @Callable(i)
629653 func flagArtwork (artId,addr,flag,note) = {
630- let $t02503825072 = idCallerDate(i)
631- let id = $t02503825072._1
632- let caller = $t02503825072._2
654+ let $t02524225276 = idCallerDate(i)
655+ let id = $t02524225276._1
656+ let caller = $t02524225276._2
633657 if (containsElement([chris, toString(this)], caller))
634658 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
635659 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
636660 else throw(("Unknow status " + flag))
637661 else throw("You are not allowed")
638662 }
639663
640664
641665
642666 @Callable(i)
643667 func deleteArtwork (artId,addr) = {
644- let $t02550825542 = idCallerDate(i)
645- let id = $t02550825542._1
646- let caller = $t02550825542._2
668+ let $t02571225746 = idCallerDate(i)
669+ let id = $t02571225746._1
670+ let caller = $t02571225746._2
647671 let addrToUse = if (containsElement([chris, toString(this)], caller))
648672 then addr
649673 else caller
650674 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
651675 if ((entryExist == ""))
652676 then throw("No art matching for this address")
653677 else {
654678 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
655679 let signID = if ((sha256Hash == ""))
656680 then getStringByKey(keySignID(addrToUse, artId))
657681 else ""
658682 let signID_legacy = if ((signID == ""))
659683 then nil
660684 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
661685 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)
662686 if (!(isArtMinted(addrToUse, artId)))
663687 then if (!(dappRunning))
664688 then throw(maintenanceMSG)
665689 else dataToDelete
666690 else if (containsElement([chris, toString(this)], caller))
667691 then dataToDelete
668692 else throw("Art already minted, you cannot delete it")
669693 }
670694 }
671695
672696
673697
674698 @Callable(i)
675699 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
676- let $t02832128391 = idCallerDateSponsored(i, pubKey)
677- let id = $t02832128391._1
678- let caller = $t02832128391._2
679- let date = $t02832128391._3
680- let isSponsored = $t02832128391._4
700+ let $t02852528595 = idCallerDateSponsored(i, pubKey)
701+ let id = $t02852528595._1
702+ let caller = $t02852528595._2
703+ let date = $t02852528595._3
704+ let isSponsored = $t02852528595._4
681705 let artworkName = getStringByKey(keyName(caller, artId))
682706 if ((artworkName == ""))
683707 then throw("This art doesn't match your account")
684708 else {
685709 let flag = getStringByKey(keyFlag(caller, artId))
686710 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
687711 then throw("Flagged artwork")
688712 else {
689713 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
690714 if ((0 > blockEnd))
691715 then throw("Negative end")
692716 else if (if ((blockEnd > 0))
693717 then if ((maxMint != 1))
694718 then true
695719 else (price != 0)
696720 else false)
697721 then throw("Timed offer only allowed for unique edition and offer only")
698722 else {
699723 let baseHeight = if ((blockEnd == 0))
700724 then 0
701725 else height
702726 if (!(acceptedAssetIds(assetId)))
703727 then throw("Something went wrong!")
704728 else if (!(validateMinSell(price)))
705729 then throw("Something went wrong!")
706730 else {
707731 let checkUser = validateUser(caller)
708732 if ((checkUser != ""))
709733 then throw(checkUser)
710734 else {
711735 let amountSold = getIntegerByKey(keyIssued(caller, artId))
712736 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
713737 if ((maxMint > 100))
714738 then throw("100 editions max per artwork")
715739 else if (if ((amountSold != 0))
716740 then (amountSold == maxCanSell)
717741 else false)
718742 then throw("Max edition reached.")
719743 else if (if ((amountSold > 0))
720744 then (maxCanSell != maxMint)
721745 else false)
722746 then throw("Cannot change maximum issuable anymore")
723747 else if (if ((bidNbr > 0))
724748 then (maxCanSell != maxMint)
725749 else false)
726750 then throw("Cannot change maximum issuable with active orders")
727751 else {
728752 let sellStatus = if (if ((price > 0))
729753 then (maxMint > 0)
730754 else false)
731755 then true
732756 else false
733757 let txToCaller = if (isSponsored)
734758 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
735759 else nil
736760 ([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)
737761 }
738762 }
739763 }
740764 }
741765 }
742766 }
743767 }
744768
745769
746770
747771 @Callable(i)
748772 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
749773
750774
751775
752776 @Callable(i)
753777 func setBid (artId,issuer) = {
754- let $t03076430804 = idCallerDate(i)
755- let id = $t03076430804._1
756- let caller = $t03076430804._2
757- let date = $t03076430804._3
758- let $t03080930845 = isPayment(i)
759- let payment = $t03080930845._1
760- let amount = $t03080930845._2
778+ let $t03096831008 = idCallerDate(i)
779+ let id = $t03096831008._1
780+ let caller = $t03096831008._2
781+ let date = $t03096831008._3
782+ let $t03101331049 = isPayment(i)
783+ let payment = $t03101331049._1
784+ let amount = $t03101331049._2
761785 let assetId = if (!(isDefined(payment.assetId)))
762786 then "WAVES"
763787 else toBase58String(value(payment.assetId))
764788 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
765789 if (if ((blockEnd != 0))
766790 then (height >= blockEnd)
767791 else false)
768792 then throw("Sale ended.")
769793 else {
770794 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
771795 if (!(acceptedAssetIds(assetId)))
772796 then throw("asset not accepted")
773797 else if (!(validateMinSell(amount)))
774798 then throw("Wrong min sell")
775799 else {
776800 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
777801 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
778802 if ((0 >= maxCanSell))
779803 then throw("No max edition set for this artwork")
780804 else if ((amountSold >= maxCanSell))
781805 then throw("Sold out, you cannot bid")
782806 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
783807 }
784808 }
785809 }
786810
787811
788812
789813 @Callable(i)
790814 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
791815
792816
793817
794818 @Callable(i)
795819 func cancelBid (artId,issuer,bidId,bidOwner) = {
796- let $t03216932230 = idCallerDate(i)
797- let id = $t03216932230._1
798- let caller = $t03216932230._2
799- let date = $t03216932230._3
820+ let $t03237332434 = idCallerDate(i)
821+ let id = $t03237332434._1
822+ let caller = $t03237332434._2
823+ let date = $t03237332434._3
800824 if (if ((caller != bidOwner))
801825 then (caller != issuer)
802826 else false)
803827 then throw("You cannot do this action")
804828 else {
805829 let returnMoneyTo = if ((caller == issuer))
806830 then bidOwner
807831 else caller
808832 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
809833 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
810834 let bidData = getStringByKey((bidDataKey + "_OPEN"))
811835 if ((bidData == ""))
812836 then throw("Bid not found")
813837 else {
814838 let bidDataArr = split(bidData, "_")
815839 let assetId = getBidAssetId(bidDataArr[0])
816840 let bidStatus = "CANCELED"
817841 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
818842 }
819843 }
820844 }
821845
822846
823847 @Verifier(tx)
824848 func verifier () = match tx {
825849 case inv: InvokeScriptTransaction =>
826850 if (if (if (if ((inv.function == "addArtwork"))
827851 then (inv.dApp == this)
828852 else false)
829853 then (inv.fee == 500000)
830854 else false)
831855 then (inv.feeAssetId == unit)
832856 else false)
833857 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
834858 else if (if (if (if ((inv.function == "updateArtwork"))
835859 then (inv.dApp == this)
836860 else false)
837861 then (inv.fee == 500000)
838862 else false)
839863 then (inv.feeAssetId == unit)
840864 else false)
841865 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
842866 else if (if (if (if ((inv.function == "sellArtwork"))
843867 then (inv.dApp == this)
844868 else false)
845869 then (inv.fee == 500000)
846870 else false)
847871 then (inv.feeAssetId == unit)
848872 else false)
849873 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
850874 else if (if (if (if ((inv.function == "acceptBid"))
851875 then (inv.dApp == this)
852876 else false)
853877 then (inv.fee == 500000)
854878 else false)
855879 then (inv.feeAssetId == unit)
856880 else false)
857881 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
858882 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
859883 case _ =>
860884 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
861885 }
862886

github/deemru/w8io/873ac7e 
160.81 ms