tx · 8Ksi41wfrTN38gFSJgqWddFTM3gFj5L87qdQQ11pwKvc

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.03700000 Waves

2023.04.04 14:36 [2519768] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "8Ksi41wfrTN38gFSJgqWddFTM3gFj5L87qdQQ11pwKvc", "fee": 3700000, "feeAssetId": null, "timestamp": 1680608284254, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "5vvmJ3YW5M8LuwbcFFUEBuDSaHDDVt1hat6Mhn8hkifNeuuUnXvADc8D6pZMMVefcC4129TRgpdXuXMH41XhRDZQ" ], "script": "base64:BgIxCAISAwoBCBIECgIRERIECgIRERIDCgEREgUKAwEBARIDCgEIEgQKAggIEgUKAwgICEkAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAGTVVMVDEwAIDIr6AlAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkbkFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAwkAAAIBAVQFByRtYXRjaDABIPd26vf3g8pl224T7gI7z1gplanB0Y3yS9ps2B1igMjeCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgAUSWR4Q2ZnR292ZXJuYW5jZURhcHAAAwEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EABk5VTVJFUwAGABNGQUNUT1JZTUFYV0FSRUhPVVNFAIDIr6AlABBSRVNPVVJDRVBSSUNFTUlOANXWCQAKTUlOUEFZTUVOVACQTgAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACkxBTkRQUkVGSVgCBExBTkQACkRVQ0tQUkVGSVgCBERVQ0sADFdITVVMVElQTElFUgCAyK+gJQAKQVVDVElPTkZFRQCQTgAIcmVzVHlwZXMJAMwIAgIDT2lsCQDMCAICA09yZQkAzAgCAgRXb29kCQDMCAICBFNhbmQJAMwIAgIEQ2xheQkAzAgCAgdPcmdhbmljBQNuaWwACG1hdFR5cGVzCQDMCAICBEZ1ZWwJAMwIAgIFTWV0YWwJAMwIAgIFUGxhbmsJAMwIAgIFR2xhc3MJAMwIAgIHUGxhc3RpYwkAzAgCAgdQcm90ZWluBQNuaWwACXByb2RUeXBlcwkAzAgCAg1GaXJzdCBBaWQgS2l0CQDMCAICCEJhY2twYWNrCQDMCAICC0Zvb2QgUmF0aW9uCQDMCAICCEpldCBQYWNrCQDMCAICBVJhZGFyBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAhAxXzFfMV8yXzJfNV8xXzEwCQDMCAICETJfNV81XzJfN181XzJfMTAwCQDMCAICEDFfMV8xXzJfMl81XzFfMTAJAMwIAgIROV85XzFfNV81XzFfNV8xMDAJAMwIAgIRMV81XzFfNV81XzFfMV8xMDAFA25pbAAPY29udElkeEFtZXJpY2FzAAAADWNvbnRJZHhFdXJvcGUAAQALY29udElkeEFzaWEAAgANY29udElkeEFmcmljYQADAA5jb250SWR4T2NlYW5pYQAEAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCCWZhY3RvcnlJZAdyZXNUeXBlCQCsAgIJAKwCAgkArAICAhtmYWN0b3J5V2hCeUNvbnRpbmVudEFuZFJlc18FCWZhY3RvcnlJZAIBXwkApAMBBQdyZXNUeXBlAQ5rZXlPcmRlckJ5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIKbGFuZE9yZGVyXwULbGFuZEFzc2V0SWQBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBEWtleUJhY2twYWNrQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAgliYWNrUGFja18FC2R1Y2tBc3NldElkAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICCW5mdE93bmVyXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgtzdGFrZWRUaW1lXwUHYXNzZXRJZAAPbG9jSWR4Q29udGluZW50AAAACmxvY0lkeFR5cGUAAQAIbG9jSWR4SWQAAgAKYnBJZHhMZXZlbAAAAAhicElkeFJlcwABAAhicElkeE1hdAACAAlicElkeFByb2QAAwAId2hJZHhWb2wAAAAId2hJZHhSZXMAAQAId2hJZHhNYXQAAgAJd2hJZHhQcm9kAAMADndoSWR4TG9ja2VkVm9sAAQACW9yZElkeFJlcwAAAAlvcmRJZHhNYXQAAQAKb3JkSWR4UHJvZAACAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBCGdldE9yZGVyAQZvcmRLZXkEAXAJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQZvcmRLZXkCMDBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOjBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOgIBOgkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCW9yZElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAXAFCW9yZElkeFJlcwIXMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhNYXQCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIJAJEDAgUBcAUKb3JkSWR4UHJvZAUDbmlsARJnZXRXYXJlaG91c2VWb2x1bWUBCXZvbFByZWZpeAQFcGFydHMJALUJAgUJdm9sUHJlZml4AgFfCQBoAgkAaAIFDFdITVVMVElQTElFUgkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwABAAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwAAARlnZXRXYXJlaG91c2VDdXJyUmVzVm9sdW1lAQljdXJyZW50V2gKAQNzdW0CA2FjYwRpdGVtCQBkAgUDYWNjCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0KAAIkbAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8KAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA3N1bQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8y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YXhQcmljZSA9IAkApAMBBQhtYXhQcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIbWF0VHlwZXMFB21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZG5TcGVudAUBbQELZ2V0QmFja3BhY2sBBWJwS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsAQxjaGVja0Jsb2NrZWQAAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBQR1bml0CAFpAQ1jb25zdHJ1Y3RvclYxAQhyZXN0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQENc2VsbFJlc291cmNlcwIHYW1vdW50cwltaW5QcmljZXMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwoBBWFkZGVyAgNhY2MBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdyZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhQsIGJ1dCB0cmllZCB0byBzZWxsIAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiVZb3UgdHJpZWQgdG8gc2VsbCBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAgI6IAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqAAAEAWIJAQxzZWxsSW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1pblByaWNlcwUBagkAlQoDCQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQCRAwIFB2Ftb3VudHMFAWoJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHcmVzTGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwJAJQKAgkAzQgCCAUGbWVyZ2VkAl8xCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzMFC3VzZG5Bc3NldElkBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMYnV5TWF0ZXJpYWxzAgdhbW91bnRzCW1heFByaWNlcwQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2RuQXNzZXRJZAkAAgECE1VTRE4gcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8KAQhtVXBkYXRlcgIDYWNjAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiRZb3UgdHJpZWQgdG8gYnV5IG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBC2J1eUludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltYXhQcmljZXMFAWoJAJUKAwkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBaggFAWICXzMJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIbVVwZGF0ZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFBm1lcmdlZAJfMwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAgFBm1lcmdlZAJfMwULdXNkbkFzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAggFBm1lcmdlZAJfMQUEcmVzdAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWV4Y2hhbmdlUmVzb3VyY2VzAQdhbW91bnRzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZG5Bc3NldElkCQACAQITVVNETiBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCWV4Y2hhbmdlcgIDYWNjAWoEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFAWoEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEA2FtagkAkQMCBQdhbW91bnRzBQFqAwkAZgIFA2FtagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCGCwgYnV0IHRyaWVkIHRvIGV4Y2hhbmdlIAkApAMBBQNhbWoDCQBmAgAABQNhbWoJAAIBCQCsAgIJAKwCAgkArAICAilZb3UgdHJpZWQgdG8gZXhjaGFuZ2UgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQUDYW1qAwkAZgIFA2FtagAACQCWCgQJAM0IAggFA2FjYwJfMQkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoFA2FtagkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBagUDYW1qCQBkAggFA2FjYwJfMwkAawMFA2FtagUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgJAM0IAggFA2FjYwJfNAkBDEludGVnZXJFbnRyeQIFBXdoS2V5BQJ3MAkAlgoECQDNCAIIBQNhY2MCXzEJAJEDAgUHcmVzTGlzdAUBagkAzQgCCAUDYWNjAl8yCQCRAwIFB21hdExpc3QFAWoIBQNhY2MCXzMIBQNhY2MCXzQEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZXhjaGFuZ2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwkAZgIIBQZtZXJnZWQCXzMFA2FtdAkAAgEJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAKQDAQUDYW10AgssIHJlcXVpcmVkPQkApAMBCAUGbWVyZ2VkAl8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIIBQZtZXJnZWQCXzECAV8JAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10CAUGbWVyZ2VkAl8zAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10CAUGbWVyZ2VkAl8zBQt1c2RuQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzggCBQRyZXN0CAUGbWVyZ2VkAl80BQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYnV5R29vZHMDCnByb2R1Y3RJZHgFbGV2ZWwIcXVhbnRpdHkEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiVidXlHb29kcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzAwkAZgIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBzaG91bGQgYmUgcG9zaXRpdmUEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBTQkAAgEJAKwCAgIxRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBNYW51ZmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQEY29udAkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8DAwkAZgIAAAUKcHJvZHVjdElkeAYJAGcCBQpwcm9kdWN0SWR4CQCQAwEFEHByb2R1Y3Rpb25NYXRyaXgJAAIBCQCsAgICFFVua25vd24gcHJvZHVjdCBpZHg9CQCkAwEFCnByb2R1Y3RJZHgEDnByb2R1Y3RDb250SWR4CQBqAgUKcHJvZHVjdElkeAkAkAMBBQpjb250aW5lbnRzAwkBAiE9AgkAkQMCBQpjb250aW5lbnRzBQ5wcm9kdWN0Q29udElkeAUEY29udAkAAgEJAKwCAgkArAICCQCsAgICHVRoaXMgcHJvZHVjdCBpcyBhdmFpbGFibGUgaW4gCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4AhEsIGJ1dCB5b3UgYXJlIGluIAUEY29udAQGcmVjaXBlCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAIBXwMJAQIhPQIJAJADAQUGcmVjaXBlCQBkAgUGTlVNUkVTAAIJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfCgEGZmlsbGVyAgNhY2MLaWdub3JlZEl0ZW0EAW4IBQNhY2MCXzIEAXgDCQBmAgkAkAMBBQhwcm9kTGlzdAUBbgkAtQkCCQCRAwIFCHByb2RMaXN0BQFuAgEsCQDMCAICATAJAMwIAgIBMAkAzAgCAgEwBQNuaWwEA3gxcwkAkQMCBQF4AAAEAngxCQENcGFyc2VJbnRWYWx1ZQEFA3gxcwQDeDJzCQCRAwIFAXgAAQQCeDIJAQ1wYXJzZUludFZhbHVlAQUDeDJzBAN4M3MJAJEDAgUBeAACBAJ4MwkBDXBhcnNlSW50VmFsdWUBBQN4M3MEBmFtb3VudAkAaAIFCHF1YW50aXR5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlAAcEAXkDCQAAAgUBbgUKcHJvZHVjdElkeAQHJG1hdGNoMAUFbGV2ZWwDCQAAAgABBQckbWF0Y2gwCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQkAZAIFAngxBQZhbW91bnQCASwFA3gycwIBLAUDeDNzAwkAAAIAAgUHJG1hdGNoMAkArAICCQCsAgIJAKwCAgkArAICBQN4MXMCASwJAKQDAQkAZAIFAngyBQZhbW91bnQCASwFA3gzcwMJAAACAAMFByRtYXRjaDAJAKwCAgkArAICCQCsAgIJAKwCAgUDeDFzAgEsBQN4MnMCASwJAKQDAQkAZAIFAngzBQZhbW91bnQJAAIBCQCsAgICIlByb2R1Y3QgbGV2ZWwgc2hvdWxkIGJlIDEuLjMsIG5vdCAJAKQDAQUFbGV2ZWwJAKwCAgkArAICCQCsAgIJAKwCAgUDeDFzAgEsBQN4MnMCASwFA3gzcwkAlAoCCQDNCAIIBQNhY2MCXzEFAXkJAGQCBQFuAAEEBmJwUHJvZAgKAAIkbAUQcHJvZHVjdGlvbk1hdHJpeAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBmZpbGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAl8xCgEIcHJvZHVjZXICA2FjYwFqBAduZWVkTWF0CQBoAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnJlY2lwZQUBagUIcXVhbnRpdHkEB2hhdmVNYXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQFqAwkAZgIFB25lZWRNYXQFB2hhdmVNYXQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdtYXRMaXN0BQFqAgQgb2YgCQCRAwIFCG1hdFR5cGVzBQFqAhYsIGJ1dCByZWNpcGUgcmVxdWlyZXMgCQCkAwEFB25lZWRNYXQCDiBmb3IgcXVhbnRpdHkgCQCkAwEFCHF1YW50aXR5AwkAZgIFB25lZWRNYXQAAAkAzQgCBQNhY2MJAKQDAQkAZQIFB2hhdmVNYXQFB25lZWRNYXQJAM0IAgUDYWNjCQCRAwIFB21hdExpc3QFAWoEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCHByb2R1Y2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQC5CQIFBm1lcmdlZAIBXwkAzAgCCQC5CQIFBmJwUHJvZAIBXwUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAkAlAoCBQNuaWwFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRhY2NlcHRTZXJ2aWNlUGF5bWVudAEHc2VydmljZQQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkbkFzc2V0SWQJAAIBAhNVU0ROIHBheW1lbnRzIG9ubHkhBARuZWVkBAckbWF0Y2gwBQdzZXJ2aWNlAwkAAAICC0xBTkRfUkVOQU1FBQckbWF0Y2gwAICt4gQJAAIBAhBVbmtub3duIHNlcnZpY2UhAwkBAiE9AgUDYW10BQRuZWVkCQACAQkArAICCQCsAgIJAKwCAgUHc2VydmljZQIHIGNvc3RzIAkApAMBBQRuZWVkAgUgVVNETgkAlAoCBQNuaWwFA2FtdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFzZXRXYXJlaG91c2VPcmRlcgIMY2FyZ29MaXN0U3RyC2xhbmRBc3NldElkBAR1c2VyCAUBaQxvcmlnaW5DYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQKY2FyZ29QYXJ0cwkAvAkCBQxjYXJnb0xpc3RTdHICAToDCQECIT0CCQCQAwEFCmNhcmdvUGFydHMAAwkAAgECNGNhcmdvTGlzdFN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECHJlc1BhcnRzCQC1CQIJAJEDAgUKY2FyZ29QYXJ0cwAAAgFfBAhtYXRQYXJ0cwkAtQkCCQCRAwIFCmNhcmdvUGFydHMAAQIBXwQJcHJvZFBhcnRzAwkAAAIJAJEDAgUKY2FyZ29QYXJ0cwACAgAFA25pbAkAtQkCCQCRAwIFCmNhcmdvUGFydHMAAgIBXwMJAQIhPQIJAJADAQUIcmVzUGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkAwkBAiE9AgkAkAMBBQhtYXRQYXJ0cwUGTlVNUkVTCQACAQIgQWxsIDYgbWF0ZXJpYWxzIHNob3VsZCBiZSBwYXNzZWQEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQMY3VycldoUmVzVm9sCQEZZ2V0V2FyZWhvdXNlQ3VyclJlc1ZvbHVtZQEFCWN1cnJlbnRXaAQMY3VycldoTWF0Vm9sCQEZZ2V0V2FyZWhvdXNlQ3Vyck1hdFZvbHVtZQEFCWN1cnJlbnRXaAQOY3VycldoR29vZHNWb2wJARtnZXRXYXJlaG91c2VDdXJyR29vZHNWb2x1bWUBBQljdXJyZW50V2gED2N1cnJXaExvY2tlZFZvbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWN1cnJlbnRXaAUOd2hJZHhMb2NrZWRWb2wEC3doU3BhY2VMZWZ0CQBlAgkAZQIJAGUCCQBlAgkBEmdldFdhcmVob3VzZVZvbHVtZQEJAJEDAgUJY3VycmVudFdoBQh3aElkeFZvbAUMY3VycldoUmVzVm9sBQxjdXJyV2hNYXRWb2wFDmN1cnJXaEdvb2RzVm9sBQ9jdXJyV2hMb2NrZWRWb2wEBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEFBm9yZEtleQQNY3VycmVudE9yZFJlcwkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeFJlcwIBXwQNY3VycmVudE9yZE1hdAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeE1hdAIBXwQOY3VycmVudE9yZFByb2QDCQAAAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCm9yZElkeFByb2QCAV8EDXVzZG5OZWVkMkxvY2sAAAoBBG9yZFICA2FjYwRpdGVtBAFqCAUDYWNjAl8xBAlpdGVtUGFydHMJALUJAgUEaXRlbQIBQAMJAQIhPQIJAJADAQUJaXRlbVBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAhuZXdPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwAABAhuZXdPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwABBAluZXdPcmRVc2QJAGsDBQhuZXdPcmRBbQUIbmV3T3JkUHIFBU1VTFQ4BAN3aHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQljdXJyV2hSZXMFAWoEC2N1ck9yZFBhcnRzCQC1CQIJAJEDAgUNY3VycmVudE9yZFJlcwUBagIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDCQBmAgAABQhjdXJPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUDd2hyCQBlAggFA2FjYwJfMwUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QJAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHIFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUIY3VyT3JkQW0IBQNhY2MCXzQDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGQCBQhuZXdPcmRBbQUIY3VyT3JkQW0JAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHIFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUGYW1EaWZmCQBkAggFA2FjYwJfNAUJbmV3T3JkVXNkCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aHIJAGUCCQBkAggFA2FjYwJfMwUIbmV3T3JkQW0FCGN1ck9yZEFtCQBlAgkAZAIIBQNhY2MCXzQFCW5ld09yZFVzZAUJY3VyT3JkVXNkAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQN3aHIFBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFA3docgIKIGF2YWlsYWJsZQkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3docgUGYW1EaWZmCQBkAggFA2FjYwJfMwUGYW1EaWZmCAUDYWNjAl80AwkAZgIAAAkAZAIFA3docgUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQhuZXdPcmRBbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUDd2hyAgogYXZhaWxhYmxlCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUDd2hyBQhuZXdPcmRBbQkAZQIJAGUCCAUDYWNjAl8zBQhuZXdPcmRBbQUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QEAXIKAAIkbAUIcmVzUGFydHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEb3JkUgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgoBBG9yZE0CA2FjYwRpdGVtBAFqCAUDYWNjAl8xBAlpdGVtUGFydHMJALUJAgUEaXRlbQIBQAMJAQIhPQIJAJADAQUJaXRlbVBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAhuZXdPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwAABAhuZXdPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwABBAluZXdPcmRVc2QJAGsDBQhuZXdPcmRBbQUIbmV3T3JkUHIFBU1VTFQ4BAN3aG0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQljdXJyV2hNYXQFAWoEC2N1ck9yZFBhcnRzCQC1CQIJAJEDAgUNY3VycmVudE9yZE1hdAUBagIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDCQBmAgAABQhjdXJPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUDd2htCQBlAggFA2FjYwJfMwUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QJAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aG0FCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUIY3VyT3JkQW0IBQNhY2MCXzQDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGQCBQhuZXdPcmRBbQUIY3VyT3JkQW0JAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aG0FCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUGYW1EaWZmCQBkAggFA2FjYwJfNAUJbmV3T3JkVXNkCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aG0JAGUCCQBkAggFA2FjYwJfMwUIbmV3T3JkQW0FCGN1ck9yZEFtCQBlAgkAZAIIBQNhY2MCXzQFCW5ld09yZFVzZAUJY3VyT3JkVXNkAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQN3aG0FBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFA3dobQIKIGF2YWlsYWJsZQkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3dobQUGYW1EaWZmCQBkAggFA2FjYwJfMwUGYW1EaWZmCAUDYWNjAl80AwkAZgIAAAkAZAIFA3dobQUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQhuZXdPcmRBbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUDd2htAgogYXZhaWxhYmxlCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUDd2htBQhuZXdPcmRBbQkAZQIJAGUCCAUDYWNjAl8zBQhuZXdPcmRBbQUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QEAW0KAAIkbAUIbWF0UGFydHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAUDbmlsCAUBcgJfMwgFAXICXzQKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBG9yZE0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYKAQRvcmRQAgNhY2MEaXRlbQQBaggFA2FjYwJfMQQJaXRlbVBhcnRzCQC1CQIFBGl0ZW0CAUADCQECIT0CCQCQAwEFCWl0ZW1QYXJ0cwACCQACAQIuSW5jb3JyZWN0IG9yZGVyIGZvcm1hdCwgc2hvdWxkIGJlIGFtb3VudEBwcmljZQQIbmV3T3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAAQIbmV3T3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAQQJbmV3T3JkVXNkCQBrAwUIbmV3T3JkQW0FCG5ld09yZFByBQVNVUxUOAQDd2hwCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKY3VycldoUHJvZAUBagQLY3VyT3JkUGFydHMJALUJAgkAkQMCBQ5jdXJyZW50T3JkUHJvZAUBagIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDCQBmAgAABQhjdXJPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUDd2hwCQBlAggFA2FjYwJfMwUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QJAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHAFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUIY3VyT3JkQW0IBQNhY2MCXzQDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGQCBQhuZXdPcmRBbQUIY3VyT3JkQW0JAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHAFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUGYW1EaWZmCQBkAggFA2FjYwJfNAUJbmV3T3JkVXNkCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aHAJAGUCCQBkAggFA2FjYwJfMwUIbmV3T3JkQW0FCGN1ck9yZEFtCQBlAgkAZAIIBQNhY2MCXzQFCW5ld09yZFVzZAUJY3VyT3JkVXNkAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQN3aHAFBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFA3docAIKIGF2YWlsYWJsZQkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3docAUGYW1EaWZmCQBkAggFA2FjYwJfMwUGYW1EaWZmCAUDYWNjAl8zAwkAZgIAAAkAZAIFA3docAUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAIC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AQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQUMY2FyZ29MaXN0U3RyBQNuaWwDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUEdXNlcgkBAS0BBQh1c2RTYWxkbwULdXNkbkFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQxjYXJnb0xpc3RTdHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRhY2NlcHRXYXJlaG91c2VPcmRlcgMKYnBPcmRlclN0cgtsYW5kQXNzZXRJZAtkdWNrQXNzZXRJZAQGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIECmNhbGxlckFkZHIJAKUIAQUGY2FsbGVyBBFzdGFrZWREdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUKY2FsbGVyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQURc3Rha2VkRHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgQDbG9jCQC1CQIJAQV2YWx1ZQEFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUwJAAIBCQCsAgIJAKwCAgIWRHVjayBsb2NhdGlvbiB0eXBlIGlzIAkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCESwgYnV0IHNob3VsZCBiZSBMAwkBAiE9AgURc3Rha2VkRHVja0Fzc2V0SWQFC2R1Y2tBc3NldElkCQACAQkArAICCQCsAgIJAKwCAgIUWW91ciBzdGFrZWQgZHVjayBpcyAFEXN0YWtlZER1Y2tBc3NldElkAg0sIGJ1dCBwYXNzZWQgBQtkdWNrQXNzZXRJZAQJbGFuZEFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUJbGFuZEFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAlsYW5kT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQlsYW5kQXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkAAAIFCWxhbmRPd25lcgUKY2FsbGVyQWRkcgkAAgECHllvdSBjYW5ub3QgdHJhZGUgd2l0aCB5b3Vyc2VsZgQMYnBPcmRlclBhcnRzCQC8CQIFCmJwT3JkZXJTdHICAToDCQECIT0CCQCQAwEFDGJwT3JkZXJQYXJ0cwADCQACAQIyYnBPcmRlclN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECGJwT3JkUmVzCQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAACAV8ECGJwT3JkTWF0CQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAECAV8ECWJwT3JkUHJvZAMJAAACCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgAFA25pbAkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgFfAwkBAiE9AgkAkAMBBQhicE9yZFJlcwUGTlVNUkVTCQACAQIgQWxsIDYgcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQDCQECIT0CCQCQAwEFCGJwT3JkTWF0BQZOVU1SRVMJAAIBAiBBbGwgNiBtYXRlcmlhbHMgc2hvdWxkIGJlIHBhc3NlZAQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQJY3VycldoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQJY3VycldoTWF0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQKY3VycldoUHJvZAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBAxjdXJyV2hSZXNWb2wJARlnZXRXYXJlaG91c2VDdXJyUmVzVm9sdW1lAQUJY3VycmVudFdoBAxjdXJyV2hNYXRWb2wJARlnZXRXYXJlaG91c2VDdXJyTWF0Vm9sdW1lAQUJY3VycmVudFdoBA5jdXJyV2hHb29kc1ZvbAkBG2dldFdhcmVob3VzZUN1cnJHb29kc1ZvbHVtZQEFCWN1cnJlbnRXaAQPY3VycldoTG9ja2VkVm9sCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VycmVudFdoBQ53aElkeExvY2tlZFZvbAQLd2hTcGFjZUxlZnQJAGUCCQBlAgkAZQIJAGUCCQESZ2V0V2FyZWhvdXNlVm9sdW1lAQkAkQMCBQljdXJyZW50V2gFCHdoSWR4Vm9sBQxjdXJyV2hSZXNWb2wFDGN1cnJXaE1hdFZvbAUOY3VycldoR29vZHNWb2wFD2N1cnJXaExvY2tlZFZvbAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkECWJwUmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQJYnBNYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBApicFByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBAZvcmRLZXkJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBAV3aE9yZAkBCGdldE9yZGVyAQUGb3JkS2V5BAh3aE9yZFJlcwkAtQkCCQCRAwIFBXdoT3JkBQlvcmRJZHhSZXMCAV8ECHdoT3JkTWF0CQC1CQIJAJEDAgUFd2hPcmQFCW9yZElkeE1hdAIBXwQJd2hPcmRQcm9kAwkAAAIJAJEDAgUFd2hPcmQFCm9yZElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgUFd2hPcmQFCm9yZElkeFByb2QCAV8EDXVzZG5OZWVkMkxvY2sAAAoBBG9yZFICA2FjYwFqBA1icE9yZFJlc1BhcnRzCQC1CQIJAJEDAgUIYnBPcmRSZXMFAWoCAUADCQECIT0CCQCQAwEFDWJwT3JkUmVzUGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UEB2JwT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1icE9yZFJlc1BhcnRzAAAEB2JwT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1icE9yZFJlc1BhcnRzAAEDCQBmAgAABQdicE9yZFByCQACAQIXUHJpY2UgY2FuJ3QgYmUgbmVnYXRpdmUECGJwT3JkVXNkCQBrAwUHYnBPcmRBbQUHYnBPcmRQcgUFTVVMVDgEA2JwcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWJwUmVzTGlzdAUBagQDd2hyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VycldoUmVzBQFqBAp3aE9yZFBhcnRzCQC1CQIJAJEDAgUId2hPcmRSZXMFAWoCAUAEB3doT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAAEB3doT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAEDAwkBAiE9AgUHYnBPcmRBbQAACQECIT0CBQdicE9yZFByBQd3aE9yZFByBwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgpQcmljZXMgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhcgZG9uJ3QgbWF0Y2ghIFdIIHByaWNlPQkApAMBBQd3aE9yZFByAg0sIHlvdXIgcHJpY2U9CQCkAwEFB2JwT3JkUHIECHdoT3JkVXNkCQBrAwUHd2hPcmRBbQUHd2hPcmRQcgUFTVVMVDgDCQAAAgUHYnBPcmRBbQAACQCYCgYJAM0IAggFA2FjYwJfMQkAkQMCBQljdXJyV2hSZXMFAWoJAM0IAggFA2FjYwJfMgkAkQMCBQh3aE9yZFJlcwUBagkAzQgCCAUDYWNjAl8zCQCRAwIFCWJwUmVzTGlzdAUBaggFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNgMJAGYCBQdicE9yZEFtAAADCQBmAgAABQd3aE9yZEFtAwkAZgIFB2JwT3JkQW0JAQEtAQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAKQDAQUHYnBPcmRBbQIEIG9mIAkAkQMCBQhyZXNUeXBlcwUBagIbLCBidXQgd2FyZWhvdXNlIG9ubHkgc2VsbHMgCQCkAwEJAQEtAQUHd2hPcmRBbQkAmAoGCQDNCAIIBQNhY2MCXzEJAJEDAgUJY3VycldoUmVzBQFqCQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwkApAMBCQBkAgUDYnByBQdicE9yZEFtCQBkAggFA2FjYwJfNAUHYnBPcmRBbQgFA2FjYwJfNQkAZAIIBQNhY2MCXzYFCGJwT3JkVXNkCQACAQkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkAkQMCBQhyZXNUeXBlcwUBagIgIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IHNlbGwgaXQDCQBmAgUHd2hPcmRBbQAAAwkAZgIJAQEtAQUHYnBPcmRBbQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIEIG9mIAkAkQMCBQhyZXNUeXBlcwUBagIaLCBidXQgd2FyZWhvdXNlIG9ubHkgYnV5cyAJAKQDAQUHd2hPcmRBbQMJAGYCCQEBLQEFB2JwT3JkQW0FA2JwcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIULCBidXQgeW91IG9ubHkgaGF2ZSAJAJEDAgUJYnBSZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqCQCYCgYJAM0IAggFA2FjYwJfMQkApAMBCQBlAgUDd2hyBQdicE9yZEFtCQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwIBMAkAZQIIBQNhY2MCXzQFB2JwT3JkQW0JAGUCCAUDYWNjAl81BQhicE9yZFVzZAgFA2FjYwJfNgkAAgEJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCRAwIFCHJlc1R5cGVzBQFqAh8gd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3QgYnV5IGl0BAFyCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJgKBgUDbmlsBQNuaWwFA25pbAAAAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEb3JkUgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgoBBG9yZE0CA2FjYwFqBA1icE9yZE1hdFBhcnRzCQC1CQIJAJEDAgUIYnBPcmRNYXQFAWoCAUADCQECIT0CCQCQAwEFDWJwT3JkTWF0UGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UEB2JwT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1icE9yZE1hdFBhcnRzAAAEB2JwT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1icE9yZE1hdFBhcnRzAAEDCQBmAgAABQdicE9yZFByCQACAQIXUHJpY2UgY2FuJ3QgYmUgbmVnYXRpdmUECGJwT3JkVXNkCQBrAwUHYnBPcmRBbQUHYnBPcmRQcgUFTVVMVDgEA2JwcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWJwTWF0TGlzdAUBagQDd2hyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VycldoTWF0BQFqBAp3aE9yZFBhcnRzCQC1CQIJAJEDAgUId2hPcmRNYXQFAWoCAUAEB3doT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAAEB3doT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAEDAwkBAiE9AgUHYnBPcmRBbQAACQECIT0CBQdicE9yZFByBQd3aE9yZFByBwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgpQcmljZXMgb2YgCQCRAwIFCG1hdFR5cGVzBQFqAhcgZG9uJ3QgbWF0Y2ghIFdIIHByaWNlPQkApAMBBQd3aE9yZFByAg0sIHlvdXIgcHJpY2U9CQCkAwEFB2JwT3JkUHIECHdoT3JkVXNkCQBrAwUHd2hPcmRBbQUHd2hPcmRQcgUFTVVMVDgDCQAAAgUHYnBPcmRBbQAACQCYCgYJAM0IAggFA2FjYwJfMQkAkQMCBQljdXJyV2hNYXQFAWoJAM0IAggFA2FjYwJfMgkAkQMCBQh3aE9yZE1hdAUBagkAzQgCCAUDYWNjAl8zCQCRAwIFCWJwTWF0TGlzdAUBaggFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNgMJAGYCBQdicE9yZEFtAAADCQBmAgAABQd3aE9yZEFtAwkAZgIFB2JwT3JkQW0JAQEtAQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAKQDAQUHYnBPcmRBbQIEIG9mIAkAkQMCBQhtYXRUeXBlcwUBagIbLCBidXQgd2FyZWhvdXNlIG9ubHkgc2VsbHMgCQCkAwEJAQEtAQUHd2hPcmRBbQkAmAoGCQDNCAIIBQNhY2MCXzEJAJEDAgUJY3VycldoTWF0BQFqCQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwkApAMBCQBkAgUDYnByBQdicE9yZEFtCQBkAggFA2FjYwJfNAUHYnBPcmRBbQgFA2FjYwJfNQkAZAIIBQNhY2MCXzYFCGJwT3JkVXNkCQACAQkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkAkQMCBQhtYXRUeXBlcwUBagIgIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IHNlbGwgaXQDCQBmAgUHd2hPcmRBbQAAAwkAZgIJAQEtAQUHYnBPcmRBbQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIEIG9mIAkAkQMCBQhtYXRUeXBlcwUBagIaLCBidXQgd2FyZWhvdXNlIG9ubHkgYnV5cyAJAKQDAQUHd2hPcmRBbQMJAGYCCQEBLQEFB2JwT3JkQW0FA2JwcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIULCBidXQgeW91IG9ubHkgaGF2ZSAJAJEDAgUJYnBNYXRMaXN0BQFqAgQgb2YgCQCRAwIFCG1hdFR5cGVzBQFqCQCYCgYJAM0IAggFA2FjYwJfMQkApAMBCQBlAgUDd2hyBQdicE9yZEFtCQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwIBMAkAZQIIBQNhY2MCXzQFB2JwT3JkQW0JAGUCCAUDYWNjAl81BQhicE9yZFVzZAgFA2FjYwJfNgkAAgEJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCRAwIFCG1hdFR5cGVzBQFqAh8gd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3QgYnV5IGl0BAFtCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJgKBgUDbmlsBQNuaWwFA25pbAgFAXICXzQIBQFyAl81CAUBcgJfNgoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEb3JkTQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgoBBG9yZFACA2FjYw1icE9yZFByb2RJdGVtBAFqCAUDYWNjAl83BA5icE9yZFByb2RQYXJ0cwkAtQkCBQ1icE9yZFByb2RJdGVtAgFAAwkBAiE9AgkAkAMBBQ5icE9yZFByb2RQYXJ0cwACCQACAQIuSW5jb3JyZWN0IG9yZGVyIGZvcm1hdCwgc2hvdWxkIGJlIGFtb3VudEBwcmljZQQHYnBPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmJwT3JkUHJvZFBhcnRzAAAEB2JwT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5icE9yZFByb2RQYXJ0cwABAwkAZgIAAAUHYnBPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAhicE9yZFVzZAkAawMFB2JwT3JkQW0FB2JwT3JkUHIFBU1VTFQ4BANicHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpicFByb2RMaXN0BQFqBAN3aHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpjdXJyV2hQcm9kBQFqBAp3aE9yZFBhcnRzCQC1CQIJAJEDAgUJd2hPcmRQcm9kBQFqAgFABAd3aE9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKd2hPcmRQYXJ0cwAABAd3aE9yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKd2hPcmRQYXJ0cwABAwMJAQIhPQIFB2JwT3JkQW0AAAkBAiE9AgUHYnBPcmRQcgUHd2hPcmRQcgcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIKUHJpY2VzIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoCFyBkb24ndCBtYXRjaCEgV0ggcHJpY2U9CQCkAwEFB3doT3JkUHICDSwgeW91ciBwcmljZT0JAKQDAQUHYnBPcmRQcgQId2hPcmRVc2QJAGsDBQd3aE9yZEFtBQd3aE9yZFByBQVNVUxUOAMJAAACBQdicE9yZEFtAAAJAJkKBwkAzQgCCAUDYWNjAl8xCQCRAwIFCmN1cnJXaFByb2QFAWoJAM0IAggFA2FjYwJfMgkAkQMCBQl3aE9yZFByb2QFAWoJAM0IAggFA2FjYwJfMwkAkQMCBQpicFByb2RMaXN0BQFqCAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82CQBkAggFA2FjYwJfNwABAwkAZgIFB2JwT3JkQW0AAAMJAGYCAAAFB3doT3JkQW0DCQBmAgUHYnBPcmRBbQkBAS0BBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkApAMBBQdicE9yZEFtAgQgb2YgCQCRAwIFCXByb2RUeXBlcwUBagIbLCBidXQgd2FyZWhvdXNlIG9ubHkgc2VsbHMgCQCkAwEJAQEtAQUHd2hPcmRBbQkAmQoHCQDNCAIIBQNhY2MCXzEJAJEDAgUKY3VycldoUHJvZAUBagkAzQgCCAUDYWNjAl8yCQCsAgIJAKwCAgkApAMBCQBkAgUHd2hPcmRBbQUHYnBPcmRBbQIBQAkApAMBBQd3aE9yZFByCQDNCAIIBQNhY2MCXzMJAKQDAQkAZAIFA2JwcgUHYnBPcmRBbQkAZAIIBQNhY2MCXzQFB2JwT3JkQW0IBQNhY2MCXzUJAGQCCAUDYWNjAl82BQhicE9yZFVzZAkAZAIIBQNhY2MCXzcAAQkAAgEJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAJEDAgUJcHJvZFR5cGVzBQFqAiAgd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3Qgc2VsbCBpdAMJAGYCBQd3aE9yZEFtAAADCQBmAgkBAS0BBQdicE9yZEFtBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAgQgb2YgCQCRAwIFCXByb2RUeXBlcwUBagIaLCBidXQgd2FyZWhvdXNlIG9ubHkgYnV5cyAJAKQDAQUHd2hPcmRBbQMJAGYCCQEBLQEFB2JwT3JkQW0FA2JwcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRl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TkZFRQUFTVVMVDYEDXVzZFdoMkJwU2FsZG8IBQFwAl81BAhhY3Rpb25zMQMJAGYCBQ11c2RXaDJCcFNhbGRvAAAJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBlAggFAXACXzUFC3VzZFdoMkJwRmVlBQt1c2RuQXNzZXRJZAUHYWN0aW9ucwQLdXNkQnAyV2hGZWUJAGsDCAUBcAJfNgUKQVVDVElPTkZFRQUFTVVMVDYEDXVzZEJwMldoU2FsZG8IBQFwAl82AwkAZgIFDXVzZEJwMldoU2FsZG8AAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkbkFzc2V0SWQJAAIBAhNVU0ROIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQ11c2RCcDJXaFNhbGRvCQACAQkArAICAhJQYXltZW50IG5lZWRlZCBpcyAJAKQDAQUNdXNkQnAyV2hTYWxkbwkAzQgCBQhhY3Rpb25zMQkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbGFuZE93bmVyCQBlAggFAXACXzYFC3VzZEJwMldoRmVlBQt1c2RuQXNzZXRJZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAUIYWN0aW9uczEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AUd/DAg==", "height": 2519768, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EvF1KUv7Nuwf1uCKFpFtaARnebs1qPPP3iuPt38J29ne Next: 3shi6okZxpcX53FyJLAF2pi4qu7ndVDoRFnu54RvBMts Diff:
OldNewDifferences
10421042
10431043 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
10441044 }
1045- func ordP (acc,j) = {
1046- let bpOrdProdParts = split(bpOrdProd[j], "@")
1045+ func ordP (acc,bpOrdProdItem) = {
1046+ let j = acc._7
1047+ let bpOrdProdParts = split(bpOrdProdItem, "@")
10471048 if ((size(bpOrdProdParts) != 2))
10481049 then throw("Incorrect order format, should be amount@price")
10491050 else {
10651066 else {
10661067 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
10671068 if ((bpOrdAm == 0))
1068- then $Tuple6((acc._1 :+ currWhProd[j]), (acc._2 :+ whOrdProd[j]), (acc._3 :+ bpProdList[j]), acc._4, acc._5, acc._6)
1069+ then $Tuple7((acc._1 :+ currWhProd[j]), (acc._2 :+ whOrdProd[j]), (acc._3 :+ bpProdList[j]), acc._4, acc._5, acc._6, (acc._7 + 1))
10691070 else if ((bpOrdAm > 0))
10701071 then if ((0 > whOrdAm))
10711072 then if ((bpOrdAm > -(whOrdAm)))
10721073 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + prodTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
1073- else $Tuple6((acc._1 :+ currWhProd[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd))
1074+ else $Tuple7((acc._1 :+ currWhProd[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd), (acc._7 + 1))
10741075 else throw((("Attempt to buy " + prodTypes[j]) + " while warehouse doesn't sell it"))
10751076 else if ((whOrdAm > 0))
10761077 then if ((-(bpOrdAm) > whOrdAm))
10771078 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + prodTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
10781079 else if ((-(bpOrdAm) > bpr))
10791080 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + bpProdList[j]) + " of ") + prodTypes[j]))
1080- else $Tuple6((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6)
1081+ else $Tuple7((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6, (acc._7 + 1))
10811082 else throw((("Attempt to sell " + prodTypes[j]) + " while warehouse doesn't buy it"))
10821083 }
10831084 }
10851086 }
10861087
10871088 let p = {
1088- let $l = [0, 1, 2, 3, 4, 5]
1089+ let $l = bpOrdProd
10891090 let $s = size($l)
1090- let $acc0 = $Tuple6(nil, nil, nil, m._4, m._5, m._6)
1091+ let $acc0 = $Tuple7(nil, nil, nil, m._4, m._5, m._6, 0)
10911092 func $f2_1 ($a,$i) = if (($i >= $s))
10921093 then $a
10931094 else ordP($a, $l[$i])
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT8 = 100000000
99
1010 let MULT10 = 10000000000
1111
1212 let chain = take(drop(this.bytes, 1), 1)
1313
1414 let usdnAssetId = match chain {
1515 case _ =>
1616 if ((base58'2W' == $match0))
1717 then base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1818 else if ((base58'2T' == $match0))
1919 then base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
2020 else throw("Unknown chain")
2121 }
2222
2323 let defaultRestAddressStr = match chain {
2424 case _ =>
2525 if ((base58'2W' == $match0))
2626 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2727 else if ((base58'2T' == $match0))
2828 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
2929 else throw("Unknown chain")
3030 }
3131
3232 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
3333
3434
3535 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
3636
3737
3838 let IdxCfgStakingDapp = 1
3939
4040 let IdxCfgEconomyDapp = 2
4141
4242 let IdxCfgGovernanceDapp = 3
4343
4444 func keyRestCfg () = "%s__restConfig"
4545
4646
4747 func keyRestAddress () = "%s__restAddr"
4848
4949
5050 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
5151
5252
5353 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
5454
5555
5656 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
5757
5858 let restCfg = readRestCfgOrFail(restContract)
5959
6060 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
6161
6262 let DEFAULTLOCATION = "Africa_F_Africa"
6363
6464 let NUMRES = 6
6565
6666 let FACTORYMAXWAREHOUSE = 10000000000
6767
6868 let RESOURCEPRICEMIN = 158549
6969
7070 let MINPAYMENT = 10000
7171
7272 let SELLMULTIPLIER = 200
7373
7474 let BUYMULTIPLIER = 300
7575
7676 let LANDPREFIX = "LAND"
7777
7878 let DUCKPREFIX = "DUCK"
7979
8080 let WHMULTIPLIER = 10000000000
8181
8282 let AUCTIONFEE = 10000
8383
8484 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
8585
8686 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
8787
8888 let prodTypes = ["First Aid Kit", "Backpack", "Food Ration", "Jet Pack", "Radar"]
8989
9090 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
9191
9292 let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "1_5_1_5_5_1_1_100"]
9393
9494 let contIdxAmericas = 0
9595
9696 let contIdxEurope = 1
9797
9898 let contIdxAsia = 2
9999
100100 let contIdxAfrica = 3
101101
102102 let contIdxOceania = 4
103103
104104 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
105105
106106
107107 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
108108
109109
110110 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
111111
112112
113113 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
114114
115115
116116 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
117117
118118
119119 func keyBlocked () = "contractsBlocked"
120120
121121
122122 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
123123
124124
125125 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
126126
127127
128128 let locIdxContinent = 0
129129
130130 let locIdxType = 1
131131
132132 let locIdxId = 2
133133
134134 let bpIdxLevel = 0
135135
136136 let bpIdxRes = 1
137137
138138 let bpIdxMat = 2
139139
140140 let bpIdxProd = 3
141141
142142 let whIdxVol = 0
143143
144144 let whIdxRes = 1
145145
146146 let whIdxMat = 2
147147
148148 let whIdxProd = 3
149149
150150 let whIdxLockedVol = 4
151151
152152 let ordIdxRes = 0
153153
154154 let ordIdxMat = 1
155155
156156 let ordIdxProd = 2
157157
158158 func asString (v) = match v {
159159 case s: String =>
160160 s
161161 case _ =>
162162 throw("fail to cast into String")
163163 }
164164
165165
166166 func getOrder (ordKey) = {
167167 let p = split(valueOrElse(getString(ordKey), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"), ":")
168168 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
169169 then p[ordIdxRes]
170170 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
171171 then p[ordIdxMat]
172172 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
173173 }
174174
175175
176176 func getWarehouseVolume (volPrefix) = {
177177 let parts = split(volPrefix, "_")
178178 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
179179 }
180180
181181
182182 func getWarehouseCurrResVolume (currentWh) = {
183183 func sum (acc,item) = (acc + parseIntValue(item))
184184
185185 let $l = split(currentWh[whIdxRes], "_")
186186 let $s = size($l)
187187 let $acc0 = 0
188188 func $f0_1 ($a,$i) = if (($i >= $s))
189189 then $a
190190 else sum($a, $l[$i])
191191
192192 func $f0_2 ($a,$i) = if (($i >= $s))
193193 then $a
194194 else throw("List size exceeds 6")
195195
196196 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
197197 }
198198
199199
200200 func getWarehouseCurrMatVolume (currentWh) = {
201201 func sum (acc,item) = (acc + parseIntValue(item))
202202
203203 let $l = split(currentWh[whIdxMat], "_")
204204 let $s = size($l)
205205 let $acc0 = 0
206206 func $f0_1 ($a,$i) = if (($i >= $s))
207207 then $a
208208 else sum($a, $l[$i])
209209
210210 func $f0_2 ($a,$i) = if (($i >= $s))
211211 then $a
212212 else throw("List size exceeds 6")
213213
214214 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
215215 }
216216
217217
218218 func getWarehouseCurrGoodsVolume (currentWh) = {
219219 let goods = currentWh[whIdxProd]
220220 if ((goods == ""))
221221 then 0
222222 else {
223223 func sum (acc,item) = (acc + parseIntValue(item))
224224
225225 let $l = split_4C(goods, "_")
226226 let $s = size($l)
227227 let $acc0 = 0
228228 func $f0_1 ($a,$i) = if (($i >= $s))
229229 then $a
230230 else sum($a, $l[$i])
231231
232232 func $f0_2 ($a,$i) = if (($i >= $s))
233233 then $a
234234 else throw("List size exceeds 50")
235235
236236 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
237237 }
238238 }
239239
240240
241241 func sellInternal (locId,resType,amount,minPrice) = {
242242 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
243243 let w0 = valueOrElse(getInteger(whKey), 0)
244244 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
245245 then 0
246246 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
247247 then (FACTORYMAXWAREHOUSE - w0)
248248 else amount
249249 let usdnReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
250250 let min99 = (minPrice - (minPrice / 100))
251251 if (((min99 * amount) > (usdnReceived * MULT8)))
252252 then throw((((((((((("Actual price = " + toString(usdnReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
253253 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdnReceived)
254254 }
255255
256256
257257 func buyInternal (locId,matType,amount,maxPrice) = {
258258 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
259259 let w0 = valueOrElse(getInteger(whKey), 0)
260260 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
261261 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
262262 else 0
263263 let m0 = min([w0, (amount - m1)])
264264 let m = (m0 + m1)
265265 let usdnSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
266266 let max101 = (maxPrice + (maxPrice / 100))
267267 if (((usdnSpent * MULT8) > (max101 * m)))
268268 then throw((((((((((("Actual price = " + toString(usdnSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
269269 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdnSpent, m)
270270 }
271271
272272
273273 func getBackpack (bpKey) = {
274274 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
275275 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
276276 then p[bpIdxRes]
277277 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
278278 then p[bpIdxMat]
279279 else "0_0_0_0_0_0", p[bpIdxProd]]
280280 }
281281
282282
283283 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
284284 then throw("Contracts are under maintenance")
285285 else unit
286286
287287
288288 @Callable(i)
289289 func constructorV1 (restAddr) = if ((i.caller != this))
290290 then throw("Permission denied")
291291 else [StringEntry(keyRestAddress(), restAddr)]
292292
293293
294294
295295 @Callable(i)
296296 func sellResources (amounts,minPrices) = {
297297 let blocked = checkBlocked()
298298 if ((blocked == blocked))
299299 then {
300300 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
301301 if ((size(i.payments) != 0))
302302 then throw("sellResources doesn't require any payments")
303303 else {
304304 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
305305 if ((curLocation[locIdxType] != "F"))
306306 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
307307 else {
308308 let locId = curLocation[locIdxId]
309309 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
310310 let resList = split(currentPack[bpIdxRes], "_")
311311 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
312312 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
313313 else if ((0 > amounts[j]))
314314 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
315315 else if ((amounts[j] > 0))
316316 then {
317317 let b = sellInternal(locId, j, amounts[j], minPrices[j])
318318 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
319319 }
320320 else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
321321
322322 let merged = {
323323 let $l = [0, 1, 2, 3, 4, 5]
324324 let $s = size($l)
325325 let $acc0 = $Tuple3(nil, nil, 0)
326326 func $f0_1 ($a,$i) = if (($i >= $s))
327327 then $a
328328 else adder($a, $l[$i])
329329
330330 func $f0_2 ($a,$i) = if (($i >= $s))
331331 then $a
332332 else throw("List size exceeds 6")
333333
334334 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
335335 }
336336 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
337337 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
338338 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
339339 }
340340 }
341341 }
342342 else throw("Strict value is not equal to itself.")
343343 }
344344
345345
346346
347347 @Callable(i)
348348 func buyMaterials (amounts,maxPrices) = {
349349 let blocked = checkBlocked()
350350 if ((blocked == blocked))
351351 then {
352352 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
353353 if ((size(i.payments) != 1))
354354 then throw("exactly 1 payment must be attached")
355355 else {
356356 let pmt = i.payments[0]
357357 let amt = pmt.amount
358358 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
359359 if ((pmtAssetId != usdnAssetId))
360360 then throw("USDN payments only!")
361361 else {
362362 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
363363 if ((curLocation[locIdxType] != "F"))
364364 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
365365 else {
366366 let locId = curLocation[locIdxId]
367367 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
368368 let matList = split(currentPack[bpIdxMat], "_")
369369 func mUpdater (acc,j) = if ((0 > amounts[j]))
370370 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
371371 else if ((amounts[j] > 0))
372372 then {
373373 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
374374 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
375375 }
376376 else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
377377
378378 let merged = {
379379 let $l = [0, 1, 2, 3, 4, 5]
380380 let $s = size($l)
381381 let $acc0 = $Tuple3(nil, nil, 0)
382382 func $f0_1 ($a,$i) = if (($i >= $s))
383383 then $a
384384 else mUpdater($a, $l[$i])
385385
386386 func $f0_2 ($a,$i) = if (($i >= $s))
387387 then $a
388388 else throw("List size exceeds 6")
389389
390390 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
391391 }
392392 if ((merged._3 > amt))
393393 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
394394 else {
395395 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
396396 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
397397 let rest = if (((amt - merged._3) > 0))
398398 then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
399399 else nil
400400 $Tuple2((merged._1 ++ rest), result)
401401 }
402402 }
403403 }
404404 }
405405 }
406406 else throw("Strict value is not equal to itself.")
407407 }
408408
409409
410410
411411 @Callable(i)
412412 func exchangeResources (amounts) = {
413413 let blocked = checkBlocked()
414414 if ((blocked == blocked))
415415 then {
416416 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
417417 if ((size(i.payments) != 1))
418418 then throw("exactly 1 payment must be attached")
419419 else {
420420 let pmt = i.payments[0]
421421 let amt = pmt.amount
422422 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
423423 if ((pmtAssetId != usdnAssetId))
424424 then throw("USDN payments only!")
425425 else {
426426 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
427427 if ((curLocation[locIdxType] != "F"))
428428 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
429429 else {
430430 let locId = curLocation[locIdxId]
431431 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
432432 let resList = split(currentPack[bpIdxRes], "_")
433433 let matList = split(currentPack[bpIdxMat], "_")
434434 func exchanger (acc,j) = {
435435 let whKey = keyFactoryWarehouseByIdAndType(locId, j)
436436 let w0 = valueOrElse(getInteger(whKey), 0)
437437 let amj = amounts[j]
438438 if ((amj > parseIntValue(resList[j])))
439439 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
440440 else if ((0 > amj))
441441 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
442442 else if ((amj > 0))
443443 then $Tuple4((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8)), (acc._4 :+ IntegerEntry(whKey, w0)))
444444 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
445445 }
446446
447447 let merged = {
448448 let $l = [0, 1, 2, 3, 4, 5]
449449 let $s = size($l)
450450 let $acc0 = $Tuple4(nil, nil, 0, nil)
451451 func $f0_1 ($a,$i) = if (($i >= $s))
452452 then $a
453453 else exchanger($a, $l[$i])
454454
455455 func $f0_2 ($a,$i) = if (($i >= $s))
456456 then $a
457457 else throw("List size exceeds 6")
458458
459459 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
460460 }
461461 if ((merged._3 > amt))
462462 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
463463 else {
464464 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
465465 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
466466 let rest = if (((amt - merged._3) > 0))
467467 then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
468468 else nil
469469 $Tuple2((rest ++ merged._4), result)
470470 }
471471 }
472472 }
473473 }
474474 }
475475 else throw("Strict value is not equal to itself.")
476476 }
477477
478478
479479
480480 @Callable(i)
481481 func buyGoods (productIdx,level,quantity) = {
482482 let blocked = checkBlocked()
483483 if ((blocked == blocked))
484484 then if ((size(i.payments) != 0))
485485 then throw("buyGoods doesn't require any payments")
486486 else if ((0 > quantity))
487487 then throw("Quantity should be positive")
488488 else {
489489 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
490490 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
491491 if ((curLocation[locIdxType] != "M"))
492492 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
493493 else {
494494 let cont = curLocation[locIdxContinent]
495495 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
496496 let matList = split(currentPack[bpIdxMat], "_")
497497 if (if ((0 > productIdx))
498498 then true
499499 else (productIdx >= size(productionMatrix)))
500500 then throw(("Unknown product idx=" + toString(productIdx)))
501501 else {
502502 let productContIdx = (productIdx % size(continents))
503503 if ((continents[productContIdx] != cont))
504504 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
505505 else {
506506 let recipe = split(productionMatrix[productIdx], "_")
507507 if ((size(recipe) != (NUMRES + 2)))
508508 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
509509 else {
510510 let prodList = if ((currentPack[bpIdxProd] == ""))
511511 then nil
512512 else split(currentPack[bpIdxProd], "_")
513513 func filler (acc,ignoredItem) = {
514514 let n = acc._2
515515 let x = if ((size(prodList) > n))
516516 then split(prodList[n], ",")
517517 else ["0", "0", "0"]
518518 let x1s = x[0]
519519 let x1 = parseIntValue(x1s)
520520 let x2s = x[1]
521521 let x2 = parseIntValue(x2s)
522522 let x3s = x[2]
523523 let x3 = parseIntValue(x3s)
524524 let amount = (quantity * parseIntValue(recipe[7]))
525525 let y = if ((n == productIdx))
526526 then match level {
527527 case _ =>
528528 if ((1 == $match0))
529529 then ((((toString((x1 + amount)) + ",") + x2s) + ",") + x3s)
530530 else if ((2 == $match0))
531531 then ((((x1s + ",") + toString((x2 + amount))) + ",") + x3s)
532532 else if ((3 == $match0))
533533 then ((((x1s + ",") + x2s) + ",") + toString((x3 + amount)))
534534 else throw(("Product level should be 1..3, not " + toString(level)))
535535 }
536536 else ((((x1s + ",") + x2s) + ",") + x3s)
537537 $Tuple2((acc._1 :+ y), (n + 1))
538538 }
539539
540540 let bpProd = ( let $l = productionMatrix
541541 let $s = size($l)
542542 let $acc0 = $Tuple2(nil, 0)
543543 func $f0_1 ($a,$i) = if (($i >= $s))
544544 then $a
545545 else filler($a, $l[$i])
546546
547547 func $f0_2 ($a,$i) = if (($i >= $s))
548548 then $a
549549 else throw("List size exceeds 50")
550550
551551 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1
552552 func producer (acc,j) = {
553553 let needMat = (parseIntValue(recipe[j]) * quantity)
554554 let haveMat = parseIntValue(matList[j])
555555 if ((needMat > haveMat))
556556 then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
557557 else if ((needMat > 0))
558558 then (acc :+ toString((haveMat - needMat)))
559559 else (acc :+ matList[j])
560560 }
561561
562562 let merged = {
563563 let $l = [0, 1, 2, 3, 4, 5]
564564 let $s = size($l)
565565 let $acc0 = nil
566566 func $f1_1 ($a,$i) = if (($i >= $s))
567567 then $a
568568 else producer($a, $l[$i])
569569
570570 func $f1_2 ($a,$i) = if (($i >= $s))
571571 then $a
572572 else throw("List size exceeds 6")
573573
574574 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
575575 }
576576 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":")
577577 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
578578 $Tuple2(nil, result)
579579 }
580580 }
581581 }
582582 }
583583 }
584584 else throw("Strict value is not equal to itself.")
585585 }
586586
587587
588588
589589 @Callable(i)
590590 func acceptServicePayment (service) = {
591591 let blocked = checkBlocked()
592592 if ((blocked == blocked))
593593 then if ((size(i.payments) != 1))
594594 then throw("exactly 1 payment must be attached")
595595 else {
596596 let pmt = i.payments[0]
597597 let amt = pmt.amount
598598 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
599599 if ((pmtAssetId != usdnAssetId))
600600 then throw("USDN payments only!")
601601 else {
602602 let need = match service {
603603 case _ =>
604604 if (("LAND_RENAME" == $match0))
605605 then 10000000
606606 else throw("Unknown service!")
607607 }
608608 if ((amt != need))
609609 then throw((((service + " costs ") + toString(need)) + " USDN"))
610610 else $Tuple2(nil, amt)
611611 }
612612 }
613613 else throw("Strict value is not equal to itself.")
614614 }
615615
616616
617617
618618 @Callable(i)
619619 func setWarehouseOrder (cargoListStr,landAssetId) = {
620620 let user = i.originCaller
621621 let addr = toString(user)
622622 let asset = value(assetInfo(fromBase58String(landAssetId)))
623623 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
624624 then throw((("NFT " + asset.name) + " is not staked"))
625625 else {
626626 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
627627 if ((owner != addr))
628628 then throw((LANDPREFIX + " is not yours"))
629629 else {
630630 let cargoParts = split_4C(cargoListStr, ":")
631631 if ((size(cargoParts) != 3))
632632 then throw("cargoListStr should contain exactly 2 ':' separators")
633633 else {
634634 let resParts = split(cargoParts[0], "_")
635635 let matParts = split(cargoParts[1], "_")
636636 let prodParts = if ((cargoParts[2] == ""))
637637 then nil
638638 else split(cargoParts[2], "_")
639639 if ((size(resParts) != NUMRES))
640640 then throw("All 6 resources should be passed")
641641 else if ((size(matParts) != NUMRES))
642642 then throw("All 6 materials should be passed")
643643 else {
644644 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
645645 let currentWh = split_4C(wh, ":")
646646 let currWhRes = split(currentWh[whIdxRes], "_")
647647 let currWhMat = split(currentWh[whIdxMat], "_")
648648 let currWhProd = if ((currentWh[whIdxProd] == ""))
649649 then nil
650650 else split(currentWh[whIdxProd], "_")
651651 let currWhResVol = getWarehouseCurrResVolume(currentWh)
652652 let currWhMatVol = getWarehouseCurrMatVolume(currentWh)
653653 let currWhGoodsVol = getWarehouseCurrGoodsVolume(currentWh)
654654 let currWhLockedVol = parseIntValue(currentWh[whIdxLockedVol])
655655 let whSpaceLeft = ((((getWarehouseVolume(currentWh[whIdxVol]) - currWhResVol) - currWhMatVol) - currWhGoodsVol) - currWhLockedVol)
656656 let ordKey = keyOrderByLand(landAssetId)
657657 let currentOrd = getOrder(ordKey)
658658 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
659659 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
660660 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
661661 then nil
662662 else split(currentOrd[ordIdxProd], "_")
663663 let usdnNeed2Lock = 0
664664 func ordR (acc,item) = {
665665 let j = acc._1
666666 let itemParts = split(item, "@")
667667 if ((size(itemParts) != 2))
668668 then throw("Incorrect order format, should be amount@price")
669669 else {
670670 let newOrdAm = parseIntValue(itemParts[0])
671671 let newOrdPr = parseIntValue(itemParts[1])
672672 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
673673 let whr = parseIntValue(currWhRes[j])
674674 let curOrdParts = split(currentOrdRes[j], "@")
675675 let curOrdAm = parseIntValue(curOrdParts[0])
676676 let curOrdPr = parseIntValue(curOrdParts[1])
677677 if ((0 > curOrdPr))
678678 then throw("Price can't be negative")
679679 else {
680680 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
681681 if ((newOrdAm == 0))
682682 then if ((curOrdAm > 0))
683683 then $Tuple4((j + 1), (acc._2 :+ toString(whr)), (acc._3 - curOrdAm), (acc._4 - curOrdUsd))
684684 else $Tuple4((j + 1), (acc._2 :+ toString((whr - curOrdAm))), (acc._3 + curOrdAm), acc._4)
685685 else if ((newOrdAm > 0))
686686 then if ((0 > curOrdAm))
687687 then {
688688 let amDiff = (newOrdAm + curOrdAm)
689689 $Tuple4((j + 1), (acc._2 :+ toString((whr - curOrdAm))), (acc._3 + amDiff), (acc._4 + newOrdUsd))
690690 }
691691 else $Tuple4((j + 1), (acc._2 :+ toString(whr)), ((acc._3 + newOrdAm) - curOrdAm), ((acc._4 + newOrdUsd) - curOrdUsd))
692692 else if ((0 > curOrdAm))
693693 then {
694694 let amDiff = (curOrdAm - newOrdAm)
695695 if ((0 > (whr - amDiff)))
696696 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whr)) + " available"))
697697 else $Tuple4((j + 1), (acc._2 :+ toString((whr - amDiff))), (acc._3 + amDiff), acc._4)
698698 }
699699 else if ((0 > (whr + newOrdAm)))
700700 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whr)) + " available"))
701701 else $Tuple4((j + 1), (acc._2 :+ toString((whr + newOrdAm))), ((acc._3 - newOrdAm) - curOrdAm), (acc._4 - curOrdUsd))
702702 }
703703 }
704704 }
705705
706706 let r = {
707707 let $l = resParts
708708 let $s = size($l)
709709 let $acc0 = $Tuple4(0, nil, 0, 0)
710710 func $f0_1 ($a,$i) = if (($i >= $s))
711711 then $a
712712 else ordR($a, $l[$i])
713713
714714 func $f0_2 ($a,$i) = if (($i >= $s))
715715 then $a
716716 else throw("List size exceeds 6")
717717
718718 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
719719 }
720720 func ordM (acc,item) = {
721721 let j = acc._1
722722 let itemParts = split(item, "@")
723723 if ((size(itemParts) != 2))
724724 then throw("Incorrect order format, should be amount@price")
725725 else {
726726 let newOrdAm = parseIntValue(itemParts[0])
727727 let newOrdPr = parseIntValue(itemParts[1])
728728 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
729729 let whm = parseIntValue(currWhMat[j])
730730 let curOrdParts = split(currentOrdMat[j], "@")
731731 let curOrdAm = parseIntValue(curOrdParts[0])
732732 let curOrdPr = parseIntValue(curOrdParts[1])
733733 if ((0 > curOrdPr))
734734 then throw("Price can't be negative")
735735 else {
736736 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
737737 if ((newOrdAm == 0))
738738 then if ((curOrdAm > 0))
739739 then $Tuple4((j + 1), (acc._2 :+ toString(whm)), (acc._3 - curOrdAm), (acc._4 - curOrdUsd))
740740 else $Tuple4((j + 1), (acc._2 :+ toString((whm - curOrdAm))), (acc._3 + curOrdAm), acc._4)
741741 else if ((newOrdAm > 0))
742742 then if ((0 > curOrdAm))
743743 then {
744744 let amDiff = (newOrdAm + curOrdAm)
745745 $Tuple4((j + 1), (acc._2 :+ toString((whm - curOrdAm))), (acc._3 + amDiff), (acc._4 + newOrdUsd))
746746 }
747747 else $Tuple4((j + 1), (acc._2 :+ toString(whm)), ((acc._3 + newOrdAm) - curOrdAm), ((acc._4 + newOrdUsd) - curOrdUsd))
748748 else if ((0 > curOrdAm))
749749 then {
750750 let amDiff = (curOrdAm - newOrdAm)
751751 if ((0 > (whm - amDiff)))
752752 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whm)) + " available"))
753753 else $Tuple4((j + 1), (acc._2 :+ toString((whm - amDiff))), (acc._3 + amDiff), acc._4)
754754 }
755755 else if ((0 > (whm + newOrdAm)))
756756 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whm)) + " available"))
757757 else $Tuple4((j + 1), (acc._2 :+ toString((whm + newOrdAm))), ((acc._3 - newOrdAm) - curOrdAm), (acc._4 - curOrdUsd))
758758 }
759759 }
760760 }
761761
762762 let m = {
763763 let $l = matParts
764764 let $s = size($l)
765765 let $acc0 = $Tuple4(0, nil, r._3, r._4)
766766 func $f1_1 ($a,$i) = if (($i >= $s))
767767 then $a
768768 else ordM($a, $l[$i])
769769
770770 func $f1_2 ($a,$i) = if (($i >= $s))
771771 then $a
772772 else throw("List size exceeds 6")
773773
774774 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
775775 }
776776 func ordP (acc,item) = {
777777 let j = acc._1
778778 let itemParts = split(item, "@")
779779 if ((size(itemParts) != 2))
780780 then throw("Incorrect order format, should be amount@price")
781781 else {
782782 let newOrdAm = parseIntValue(itemParts[0])
783783 let newOrdPr = parseIntValue(itemParts[1])
784784 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
785785 let whp = parseIntValue(currWhProd[j])
786786 let curOrdParts = split(currentOrdProd[j], "@")
787787 let curOrdAm = parseIntValue(curOrdParts[0])
788788 let curOrdPr = parseIntValue(curOrdParts[1])
789789 if ((0 > curOrdPr))
790790 then throw("Price can't be negative")
791791 else {
792792 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
793793 if ((newOrdAm == 0))
794794 then if ((curOrdAm > 0))
795795 then $Tuple4((j + 1), (acc._2 :+ toString(whp)), (acc._3 - curOrdAm), (acc._4 - curOrdUsd))
796796 else $Tuple4((j + 1), (acc._2 :+ toString((whp - curOrdAm))), (acc._3 + curOrdAm), acc._4)
797797 else if ((newOrdAm > 0))
798798 then if ((0 > curOrdAm))
799799 then {
800800 let amDiff = (newOrdAm + curOrdAm)
801801 $Tuple4((j + 1), (acc._2 :+ toString((whp - curOrdAm))), (acc._3 + amDiff), (acc._4 + newOrdUsd))
802802 }
803803 else $Tuple4((j + 1), (acc._2 :+ toString(whp)), ((acc._3 + newOrdAm) - curOrdAm), ((acc._4 + newOrdUsd) - curOrdUsd))
804804 else if ((0 > curOrdAm))
805805 then {
806806 let amDiff = (curOrdAm - newOrdAm)
807807 if ((0 > (whp - amDiff)))
808808 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whp)) + " available"))
809809 else $Tuple4((j + 1), (acc._2 :+ toString((whp - amDiff))), (acc._3 + amDiff), acc._3)
810810 }
811811 else if ((0 > (whp + newOrdAm)))
812812 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whp)) + " available"))
813813 else $Tuple4((j + 1), (acc._2 :+ toString((whp + newOrdAm))), ((acc._3 - newOrdAm) - curOrdAm), (acc._4 - curOrdUsd))
814814 }
815815 }
816816 }
817817
818818 let p = {
819819 let $l = prodParts
820820 let $s = size($l)
821821 let $acc0 = $Tuple4(0, nil, m._3, m._4)
822822 func $f2_1 ($a,$i) = if (($i >= $s))
823823 then $a
824824 else ordP($a, $l[$i])
825825
826826 func $f2_2 ($a,$i) = if (($i >= $s))
827827 then $a
828828 else throw("List size exceeds 50")
829829
830830 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
831831 }
832832 let volSaldo = p._3
833833 if ((volSaldo > whSpaceLeft))
834834 then throw((((("Attempt to reserve " + toString(volSaldo)) + " space, but only ") + toString(whSpaceLeft)) + " warehouse space left"))
835835 else {
836836 let whStr = makeString_2C([currentWh[whIdxVol], makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_"), toString(volSaldo)], ":")
837837 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
838838 if ((whSave == whSave))
839839 then {
840840 let usdSaldo = p._4
841841 if ((usdSaldo > 0))
842842 then if ((size(i.payments) != 1))
843843 then throw("exactly 1 payment must be attached")
844844 else {
845845 let pmt = i.payments[0]
846846 let amt = pmt.amount
847847 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
848848 if ((pmtAssetId != usdnAssetId))
849849 then throw("USDN payments only!")
850850 else if ((amt != usdSaldo))
851851 then throw(("Payment needed is " + toString(usdSaldo)))
852852 else [StringEntry(ordKey, cargoListStr)]
853853 }
854854 else if ((usdSaldo == 0))
855855 then if ((size(i.payments) != 0))
856856 then throw("No payments needed")
857857 else [StringEntry(ordKey, cargoListStr)]
858858 else if ((size(i.payments) != 0))
859859 then throw("No payments needed")
860860 else [ScriptTransfer(user, -(usdSaldo), usdnAssetId), StringEntry(ordKey, cargoListStr)]
861861 }
862862 else throw("Strict value is not equal to itself.")
863863 }
864864 }
865865 }
866866 }
867867 }
868868 }
869869
870870
871871
872872 @Callable(i)
873873 func acceptWarehouseOrder (bpOrderStr,landAssetId,duckAssetId) = {
874874 let caller = i.originCaller
875875 let callerAddr = toString(caller)
876876 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
877877 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
878878 let loc = split(value(curLocation), "_")
879879 if ((loc[locIdxType] != "L"))
880880 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
881881 else if ((stakedDuckAssetId != duckAssetId))
882882 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
883883 else {
884884 let landAsset = value(assetInfo(fromBase58String(landAssetId)))
885885 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
886886 then throw((("NFT " + landAsset.name) + " is not staked"))
887887 else {
888888 let landOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
889889 if ((landOwner == callerAddr))
890890 then throw("You cannot trade with yourself")
891891 else {
892892 let bpOrderParts = split_4C(bpOrderStr, ":")
893893 if ((size(bpOrderParts) != 3))
894894 then throw("bpOrderStr should contain exactly 2 ':' separators")
895895 else {
896896 let bpOrdRes = split(bpOrderParts[0], "_")
897897 let bpOrdMat = split(bpOrderParts[1], "_")
898898 let bpOrdProd = if ((bpOrderParts[2] == ""))
899899 then nil
900900 else split(bpOrderParts[2], "_")
901901 if ((size(bpOrdRes) != NUMRES))
902902 then throw("All 6 resources should be passed")
903903 else if ((size(bpOrdMat) != NUMRES))
904904 then throw("All 6 materials should be passed")
905905 else {
906906 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
907907 let currentWh = split_4C(wh, ":")
908908 let currWhRes = split(currentWh[whIdxRes], "_")
909909 let currWhMat = split(currentWh[whIdxMat], "_")
910910 let currWhProd = if ((currentWh[whIdxProd] == ""))
911911 then nil
912912 else split(currentWh[whIdxProd], "_")
913913 let currWhResVol = getWarehouseCurrResVolume(currentWh)
914914 let currWhMatVol = getWarehouseCurrMatVolume(currentWh)
915915 let currWhGoodsVol = getWarehouseCurrGoodsVolume(currentWh)
916916 let currWhLockedVol = parseIntValue(currentWh[whIdxLockedVol])
917917 let whSpaceLeft = ((((getWarehouseVolume(currentWh[whIdxVol]) - currWhResVol) - currWhMatVol) - currWhGoodsVol) - currWhLockedVol)
918918 let bpKey = keyBackpackByDuck(duckAssetId)
919919 let currentPack = getBackpack(bpKey)
920920 let bpResList = split(currentPack[bpIdxRes], "_")
921921 let bpMatList = split(currentPack[bpIdxMat], "_")
922922 let bpProdList = if ((currentPack[bpIdxProd] == ""))
923923 then nil
924924 else split(currentPack[bpIdxProd], "_")
925925 let ordKey = keyOrderByLand(landAssetId)
926926 let whOrd = getOrder(ordKey)
927927 let whOrdRes = split(whOrd[ordIdxRes], "_")
928928 let whOrdMat = split(whOrd[ordIdxMat], "_")
929929 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
930930 then nil
931931 else split(whOrd[ordIdxProd], "_")
932932 let usdnNeed2Lock = 0
933933 func ordR (acc,j) = {
934934 let bpOrdResParts = split(bpOrdRes[j], "@")
935935 if ((size(bpOrdResParts) != 2))
936936 then throw("Incorrect order format, should be amount@price")
937937 else {
938938 let bpOrdAm = parseIntValue(bpOrdResParts[0])
939939 let bpOrdPr = parseIntValue(bpOrdResParts[1])
940940 if ((0 > bpOrdPr))
941941 then throw("Price can't be negative")
942942 else {
943943 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
944944 let bpr = parseIntValue(bpResList[j])
945945 let whr = parseIntValue(currWhRes[j])
946946 let whOrdParts = split(whOrdRes[j], "@")
947947 let whOrdAm = parseIntValue(whOrdParts[0])
948948 let whOrdPr = parseIntValue(whOrdParts[1])
949949 if (if ((bpOrdAm != 0))
950950 then (bpOrdPr != whOrdPr)
951951 else false)
952952 then throw(((((("Prices of " + resTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
953953 else {
954954 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
955955 if ((bpOrdAm == 0))
956956 then $Tuple6((acc._1 :+ currWhRes[j]), (acc._2 :+ whOrdRes[j]), (acc._3 :+ bpResList[j]), acc._4, acc._5, acc._6)
957957 else if ((bpOrdAm > 0))
958958 then if ((0 > whOrdAm))
959959 then if ((bpOrdAm > -(whOrdAm)))
960960 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + resTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
961961 else $Tuple6((acc._1 :+ currWhRes[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd))
962962 else throw((("Attempt to buy " + resTypes[j]) + " while warehouse doesn't sell it"))
963963 else if ((whOrdAm > 0))
964964 then if ((-(bpOrdAm) > whOrdAm))
965965 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + resTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
966966 else if ((-(bpOrdAm) > bpr))
967967 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + bpResList[j]) + " of ") + resTypes[j]))
968968 else $Tuple6((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6)
969969 else throw((("Attempt to sell " + resTypes[j]) + " while warehouse doesn't buy it"))
970970 }
971971 }
972972 }
973973 }
974974
975975 let r = {
976976 let $l = [0, 1, 2, 3, 4, 5]
977977 let $s = size($l)
978978 let $acc0 = $Tuple6(nil, nil, nil, 0, 0, 0)
979979 func $f0_1 ($a,$i) = if (($i >= $s))
980980 then $a
981981 else ordR($a, $l[$i])
982982
983983 func $f0_2 ($a,$i) = if (($i >= $s))
984984 then $a
985985 else throw("List size exceeds 6")
986986
987987 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
988988 }
989989 func ordM (acc,j) = {
990990 let bpOrdMatParts = split(bpOrdMat[j], "@")
991991 if ((size(bpOrdMatParts) != 2))
992992 then throw("Incorrect order format, should be amount@price")
993993 else {
994994 let bpOrdAm = parseIntValue(bpOrdMatParts[0])
995995 let bpOrdPr = parseIntValue(bpOrdMatParts[1])
996996 if ((0 > bpOrdPr))
997997 then throw("Price can't be negative")
998998 else {
999999 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
10001000 let bpr = parseIntValue(bpMatList[j])
10011001 let whr = parseIntValue(currWhMat[j])
10021002 let whOrdParts = split(whOrdMat[j], "@")
10031003 let whOrdAm = parseIntValue(whOrdParts[0])
10041004 let whOrdPr = parseIntValue(whOrdParts[1])
10051005 if (if ((bpOrdAm != 0))
10061006 then (bpOrdPr != whOrdPr)
10071007 else false)
10081008 then throw(((((("Prices of " + matTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
10091009 else {
10101010 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
10111011 if ((bpOrdAm == 0))
10121012 then $Tuple6((acc._1 :+ currWhMat[j]), (acc._2 :+ whOrdMat[j]), (acc._3 :+ bpMatList[j]), acc._4, acc._5, acc._6)
10131013 else if ((bpOrdAm > 0))
10141014 then if ((0 > whOrdAm))
10151015 then if ((bpOrdAm > -(whOrdAm)))
10161016 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + matTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
10171017 else $Tuple6((acc._1 :+ currWhMat[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd))
10181018 else throw((("Attempt to buy " + matTypes[j]) + " while warehouse doesn't sell it"))
10191019 else if ((whOrdAm > 0))
10201020 then if ((-(bpOrdAm) > whOrdAm))
10211021 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + matTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
10221022 else if ((-(bpOrdAm) > bpr))
10231023 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + bpMatList[j]) + " of ") + matTypes[j]))
10241024 else $Tuple6((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6)
10251025 else throw((("Attempt to sell " + matTypes[j]) + " while warehouse doesn't buy it"))
10261026 }
10271027 }
10281028 }
10291029 }
10301030
10311031 let m = {
10321032 let $l = [0, 1, 2, 3, 4, 5]
10331033 let $s = size($l)
10341034 let $acc0 = $Tuple6(nil, nil, nil, r._4, r._5, r._6)
10351035 func $f1_1 ($a,$i) = if (($i >= $s))
10361036 then $a
10371037 else ordM($a, $l[$i])
10381038
10391039 func $f1_2 ($a,$i) = if (($i >= $s))
10401040 then $a
10411041 else throw("List size exceeds 6")
10421042
10431043 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
10441044 }
1045- func ordP (acc,j) = {
1046- let bpOrdProdParts = split(bpOrdProd[j], "@")
1045+ func ordP (acc,bpOrdProdItem) = {
1046+ let j = acc._7
1047+ let bpOrdProdParts = split(bpOrdProdItem, "@")
10471048 if ((size(bpOrdProdParts) != 2))
10481049 then throw("Incorrect order format, should be amount@price")
10491050 else {
10501051 let bpOrdAm = parseIntValue(bpOrdProdParts[0])
10511052 let bpOrdPr = parseIntValue(bpOrdProdParts[1])
10521053 if ((0 > bpOrdPr))
10531054 then throw("Price can't be negative")
10541055 else {
10551056 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
10561057 let bpr = parseIntValue(bpProdList[j])
10571058 let whr = parseIntValue(currWhProd[j])
10581059 let whOrdParts = split(whOrdProd[j], "@")
10591060 let whOrdAm = parseIntValue(whOrdParts[0])
10601061 let whOrdPr = parseIntValue(whOrdParts[1])
10611062 if (if ((bpOrdAm != 0))
10621063 then (bpOrdPr != whOrdPr)
10631064 else false)
10641065 then throw(((((("Prices of " + prodTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
10651066 else {
10661067 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
10671068 if ((bpOrdAm == 0))
1068- then $Tuple6((acc._1 :+ currWhProd[j]), (acc._2 :+ whOrdProd[j]), (acc._3 :+ bpProdList[j]), acc._4, acc._5, acc._6)
1069+ then $Tuple7((acc._1 :+ currWhProd[j]), (acc._2 :+ whOrdProd[j]), (acc._3 :+ bpProdList[j]), acc._4, acc._5, acc._6, (acc._7 + 1))
10691070 else if ((bpOrdAm > 0))
10701071 then if ((0 > whOrdAm))
10711072 then if ((bpOrdAm > -(whOrdAm)))
10721073 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + prodTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
1073- else $Tuple6((acc._1 :+ currWhProd[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd))
1074+ else $Tuple7((acc._1 :+ currWhProd[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd), (acc._7 + 1))
10741075 else throw((("Attempt to buy " + prodTypes[j]) + " while warehouse doesn't sell it"))
10751076 else if ((whOrdAm > 0))
10761077 then if ((-(bpOrdAm) > whOrdAm))
10771078 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + prodTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
10781079 else if ((-(bpOrdAm) > bpr))
10791080 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + bpProdList[j]) + " of ") + prodTypes[j]))
1080- else $Tuple6((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6)
1081+ else $Tuple7((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6, (acc._7 + 1))
10811082 else throw((("Attempt to sell " + prodTypes[j]) + " while warehouse doesn't buy it"))
10821083 }
10831084 }
10841085 }
10851086 }
10861087
10871088 let p = {
1088- let $l = [0, 1, 2, 3, 4, 5]
1089+ let $l = bpOrdProd
10891090 let $s = size($l)
1090- let $acc0 = $Tuple6(nil, nil, nil, m._4, m._5, m._6)
1091+ let $acc0 = $Tuple7(nil, nil, nil, m._4, m._5, m._6, 0)
10911092 func $f2_1 ($a,$i) = if (($i >= $s))
10921093 then $a
10931094 else ordP($a, $l[$i])
10941095
10951096 func $f2_2 ($a,$i) = if (($i >= $s))
10961097 then $a
10971098 else throw("List size exceeds 50")
10981099
10991100 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
11001101 }
11011102 let volSaldo = p._4
11021103 let whStr = makeString_2C([currentWh[whIdxVol], makeString(r._1, "_"), makeString(m._1, "_"), makeString(p._1, "_"), toString(volSaldo)], ":")
11031104 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_")], ":")
11041105 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(r._3, "_"), makeString(m._3, "_"), makeString(p._3, "_")], ":")
11051106 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
11061107 if ((whSave == whSave))
11071108 then {
11081109 let bpSave = invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil)
11091110 if ((bpSave == bpSave))
11101111 then {
11111112 let actions = [StringEntry(ordKey, newWhOrdStr)]
11121113 let usdWh2BpFee = fraction(p._5, AUCTIONFEE, MULT6)
11131114 let usdWh2BpSaldo = p._5
11141115 let actions1 = if ((usdWh2BpSaldo > 0))
11151116 then (actions :+ ScriptTransfer(caller, (p._5 - usdWh2BpFee), usdnAssetId))
11161117 else actions
11171118 let usdBp2WhFee = fraction(p._6, AUCTIONFEE, MULT6)
11181119 let usdBp2WhSaldo = p._6
11191120 if ((usdBp2WhSaldo > 0))
11201121 then if ((size(i.payments) != 1))
11211122 then throw("exactly 1 payment must be attached")
11221123 else {
11231124 let pmt = i.payments[0]
11241125 let amt = pmt.amount
11251126 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
11261127 if ((pmtAssetId != usdnAssetId))
11271128 then throw("USDN payments only!")
11281129 else if ((amt != usdBp2WhSaldo))
11291130 then throw(("Payment needed is " + toString(usdBp2WhSaldo)))
11301131 else (actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - usdBp2WhFee), usdnAssetId))
11311132 }
11321133 else if ((size(i.payments) != 0))
11331134 then throw("No payments needed")
11341135 else actions1
11351136 }
11361137 else throw("Strict value is not equal to itself.")
11371138 }
11381139 else throw("Strict value is not equal to itself.")
11391140 }
11401141 }
11411142 }
11421143 }
11431144 }
11441145 }
11451146
11461147

github/deemru/w8io/873ac7e 
185.54 ms