tx · DhpBYuFyvQCLGN2GGy2znExSW2QHwy1jkRTAxJtHqiEn

3N33NL4BGxFEEiXKgnENVRDiE3RwkYmaNmS:  -0.02800000 Waves

2023.03.15 22:48 [2491581] smart account 3N33NL4BGxFEEiXKgnENVRDiE3RwkYmaNmS > SELF 0.00000000 Waves

{ "type": 13, "id": "DhpBYuFyvQCLGN2GGy2znExSW2QHwy1jkRTAxJtHqiEn", "fee": 2800000, "feeAssetId": null, "timestamp": 1678909594451, "version": 2, "chainId": 84, "sender": "3N33NL4BGxFEEiXKgnENVRDiE3RwkYmaNmS", "senderPublicKey": "FeKA4QnfyZ9Q6eep2FDJEZxFr8cn1tbStnN5SJeEnPaB", "proofs": [ "DiC5kUqsttNJ44QckKGWHkEqKCPrLJZAy3cJuR7KM9PFWLfTG76xj9v9sHaRZw9Vhs5k4pDfqE6jRN3ZT79H4Qj" ], "script": "base64:BgJNCAISBQoDAQgBEgQKAgEYEgoKCAEBAQgIGAgBEgkKBwEBAQgICAESBAoCAQESBAoCAQESAwoBCBIDCgEBEgQKAgEIEgQKAgEBEgMKAQh0AAlTRVBBUkFUT1ICAl9fAA5BUkdTX1NFUEFSQVRPUgIEIyMjIwAIS0VZX0lOSVQCBElOSVQADEtFWV9NVUxUSVNJRwIITVVMVElTSUcACktFWV9TVEFUVVMCBlNUQVRVUwASS0VZX1BST1hZX1NFQ19ERVBPAhZQUk9YWV9TRUNVUklUWV9ERVBPU0lUABxLRVlfUFJPWFlfU0VDX0RFUE9fUEVSX0VWRU5UAiBQUk9YWV9TRUNVUklUWV9ERVBPU0lUX1BFUl9FVkVOVAAOS0VZX0VWRU5UX1RZUEUCCkVWRU5UX1RZUEUAD0tFWV9XQVZFU19FVkVOVAILV0FWRVNfRVZFTlQADUtFWV9FVk1fRVZFTlQCCUVWTV9FVkVOVAAUS0VZX1dBVkVTX0VWRU5UX1NJWkUCEFdBVkVTX0VWRU5UX1NJWkUAEktFWV9FVk1fRVZFTlRfU0laRQIORVZNX0VWRU5UX1NJWkUAFktFWV9XQVZFU19FVkVOVF9TVEFUVVMCEldBVkVTX0VWRU5UX1NUQVRVUwAUS0VZX0VWTV9FVkVOVF9TVEFUVVMCEEVWTV9FVkVOVF9TVEFUVVMAGUtFWV9XQVZFU19FVkVOVF9QVUJMSVNIRUQCFVdBVkVTX0VWRU5UX1BVQkxJU0hFRAAXS0VZX0VWTV9FVkVOVF9QVUJMSVNIRUQCE0VWTV9FVkVOVF9QVUJMSVNIRUQAEUtFWV9DVVJSRU5UX0VQT0NIAg1DVVJSRU5UX0VQT0NIAAhLRVlfU0laRQIEU0laRQAWS0VZX1dBVkVTX0VWRU5UX0NBTExFUgISV0FWRVNfRVZFTlRfQ0FMTEVSABRLRVlfRVZNX0VWRU5UX0NBTExFUgIQRVZNX0VWRU5UX0NBTExFUgAXS0VZX1dJVE5FU1NFU19QRVJfRVBPQ0gCE1dJVE5FU1NFU19QRVJfRVBPQ0gAGEtFWV9XQVZFU19FVkVOVF9FWEVDVVRPUgIUV0FWRVNfRVZFTlRfRVhFQ1VUT1IAFktFWV9FVk1fRVZFTlRfRVhFQ1VUT1ICEkVWTV9FVkVOVF9FWEVDVVRPUgAYS0VZX1JFV0FSRF9UT0tFTl9BRERSRVNTAhRSRVdBUkRfVE9LRU5fQUREUkVTUwARS0VZX1JFV0FSRF9BTU9VTlQCDVJFV0FSRF9BTU9VTlQADkZVTkNfTUlOVF9NQU5ZAghtaW50TWFueQAQRVZFTlRfVFlQRV9XQVZFUwIFV0FWRVMADkVWRU5UX1RZUEVfRVZNAgNFVk0AF0VWRU5UX1NUQVRVU19QUk9DRVNTSU5HAAEAFkVWRU5UX1NUQVRVU19DT05GSVJNRUQAAgAVRVZFTlRfU1RBVFVTX1JFSkVDVEVEAAMAB01BWF9JTlQA//////////9/ARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8EByRtYXRjaDAJAOwHAQkA2QQBBQhhc3NldElkXwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQxfdmFsaWRhdGVJbnQEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwMDCQBmAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8GCQBmAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgEPX3ZhbGlkYXRlU3RyaW5nAgR2YWxfBGVycl8DAwkAZwIAAAkAsQIBBQR2YWxfBgkBCGNvbnRhaW5zAgUEdmFsXwUJU0VQQVJBVE9SCQACAQUEZXJyXwYBEl92YWxpZGF0ZUFyZ1N0cmluZwIEdmFsXwRlcnJfAwMJAQhjb250YWlucwIFBHZhbF8FDkFSR1NfU0VQQVJBVE9SBgkBCGNvbnRhaW5zAgUEdmFsXwUJU0VQQVJBVE9SCQACAQUEZXJyXwYBDV92YWxpZGF0ZUFyZ3MCBWFyZ3NfBGVycl8DCQBmAgkAkAMBBQVhcmdzXwAWCQACAQUEZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAlAoCAwgFA2FjYwJfMQkBEl92YWxpZGF0ZUFyZ1N0cmluZwIFBGVsZW0IBQNhY2MC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AMwIAgkApQgBBQhhY2NvdW50XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlUHJveHlTZWNEZXBvAghhY2NvdW50XwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUSS0VZX1BST1hZX1NFQ19ERVBPCQDMCAIJAKUIAQUIYWNjb3VudF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBGV9sb2FkUHJveHlTZWNEZXBvUGVyRXZlbnQABAckbWF0Y2gwCQCfCAEFHEtFWV9QUk9YWV9TRUNfREVQT19QRVJfRVZFTlQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGV9zYXZlUHJveHlTZWNEZXBvUGVyRXZlbnQBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFHEtFWV9QUk9YWV9TRUNfREVQT19QRVJfRVZFTlQFBHZhbF8FA25pbAETX2xvYWRXYXZlc0V2ZW50U2l6ZQAEByRtYXRjaDAJAJ8IAQUUS0VZX1dBVkVTX0VWRU5UX1NJWkUDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABE19zYXZlV2F2ZXNFdmVudFNpemUBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFFEtFWV9XQVZFU19FVkVOVF9TSVpFBQR2YWxfBQNuaWwBEV9sb2FkRVZNRXZlbnRTaXplAAQHJG1hdGNoMAkAnwgBBRJLRVlfRVZNX0VWRU5UX1NJWkUDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlRVZNRXZlbnRTaXplAQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJLRVlfRVZNX0VWRU5UX1NJWkUFBHZhbF8FA25pbAEPX2xvYWRXYXZlc0V2ZW50AQZpbmRleF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFD0tFWV9XQVZFU19FVkVOVAkAzAgCCQCkAwEFBmluZGV4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUJ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S0VZX0VWRU5UX1RZUEUJAMwIAgkApAMBBQxleGVjQ2hhaW5JZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQ5fc2F2ZUV2ZW50VHlwZQIMZXhlY0NoYWluSWRfBHZhbF8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFDktFWV9FVkVOVF9UWVBFCQDMCAIJAKQDAQUMZXhlY0NoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARVfbG9hZFdhdmVzRXZlbnRTdGF0dXMBCmV2ZW50SGFzaF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFktFWV9XQVZFU19FVkVOVF9TVEFUVVMJAMwIAgUKZXZlbnRIYXNoXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABFV9zYXZlV2F2ZXNFdmVudFN0YXR1cwIKZXZlbnRIYXNoXwdzdGF0dXNfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUWS0VZX1dBVkVTX0VWRU5UX1NUQVRVUwkAzAgCBQpldmVudEhhc2hfBQNuaWwFCVNFUEFSQVRPUgUHc3RhdHVzXwUDbmlsARNfbG9hZEVWTUV2ZW50U3RhdHVzAQpldmVudEhhc2hfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRRLRVlfRVZNX0VWRU5UX1NUQVRVUwkAzAgCBQpldmVudEhhc2hfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAETX3NhdmVFVk1FdmVudFN0YXR1cwIKZXZlbnRIYXNoXwdzdGF0dXNfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9TVEFUVVMJAMwIAgUKZXZlbnRIYXNoXwUDbmlsBQlTRVBBUkFUT1IFB3N0YXR1c18FA25pbAEhX2xvYWRQdWJsaXNoZWRXYXZlc0V2ZW50QnlXaXRuZXNzAgpwdWJsaWNLZXlfCGV2ZW50SWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRlLRVlfV0FWRVNfRVZFTlRfUFVCTElTSEVECQDMCAIFCnB1YmxpY0tleV8JAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABIV9zYXZlUHVibGlzaGVkV2F2ZXNFdmVudEJ5V2l0bmVzcwMKcHVibGljS2V5XwhldmVudElkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUZS0VZX1dBVkVTX0VWRU5UX1BVQkxJU0hFRAkAzAgCBQpwdWJsaWNLZXlfCQDMCAIJAKQDAQUIZXZlbnRJZF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBH19sb2FkUHVibGlzaGVkRVZNRXZlbnRCeVdpdG5lc3MCCnB1YmxpY0tleV8IZXZlbnRJZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFF0tFWV9FVk1fRVZFTlRfUFVCTElTSEVECQDMCAIFCnB1YmxpY0tleV8JAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABH19zYXZlUHVibGlzaGVkRVZNRXZlbnRCeVdpdG5lc3MDCnB1YmxpY0tleV8IZXZlbnRJZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFF0tFWV9FVk1fRVZFTlRfUFVCTElTSEVECQDMCAIFCnB1YmxpY0tleV8JAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAERX2xvYWRDdXJyZW50RXBvY2gBDmNhbGxlckNoYWluSWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRFLRVlfQ1VSUkVOVF9FUE9DSAkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAERX3NhdmVDdXJyZW50RXBvY2gCDmNhbGxlckNoYWluSWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRFLRVlfQ1VSUkVOVF9FUE9DSAkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARxfbG9hZFdhdmVzRXZlbnRDYWxsZXJJZHhTaXplAQ5jYWxsZXJDaGFpbklkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUWS0VZX1dBVkVTX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEcX3NhdmVXYXZlc0V2ZW50Q2FsbGVySWR4U2l6ZQIOY2FsbGVyQ2hhaW5JZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFktFWV9XQVZFU19FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEYX2xvYWRXYXZlc0V2ZW50Q2FsbGVySWR4Ag5jYWxsZXJDaGFpbklkXwRpZHhfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRZLRVlfV0FWRVNfRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgkApAMBBQRpZHhfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEYX3NhdmVXYXZlc0V2ZW50Q2FsbGVySWR4Aw5jYWxsZXJDaGFpbklkXwRpZHhfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRZLRVlfV0FWRVNfRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgkApAMBBQRpZHhfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARpfbG9hZEVWTUV2ZW50Q2FsbGVySWR4U2l6ZQEOY2FsbGVyQ2hhaW5JZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFEtFWV9FVk1fRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARpfc2F2ZUVWTUV2ZW50Q2FsbGVySWR4U2l6ZQIOY2FsbGVyQ2hhaW5JZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFEtFWV9FVk1fRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBFl9sb2FkRVZNRXZlbnRDYWxsZXJJZHgCDmNhbGxlckNoYWluSWRfBGlkeF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFEtFWV9FVk1fRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgkApAMBBQRpZHhfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEWX3NhdmVFVk1FdmVudENhbGxlcklkeAMOY2FsbGVyQ2hhaW5JZF8EaWR4XwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBHl9sb2FkV2F2ZXNFdmVudEV4ZWN1dG9ySWR4U2l6ZQERZXhlY3V0aW9uQ2hhaW5JZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFGEtFWV9XQVZFU19FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEeX3NhdmVXYXZlc0V2ZW50RXhlY3V0b3JJZHhTaXplAhFleGVjdXRpb25DaGFpbklkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUYS0VZX1dBVkVTX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBGl9sb2FkV2F2ZXNFdmVudEV4ZWN1dG9ySWR4AhFleGVjdXRpb25DaGFpbklkXwRpZHhfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRhLRVlfV0FWRVNfRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARpfc2F2ZVdhdmVzRXZlbnRFeGVjdXRvcklkeAMRZXhlY3V0aW9uQ2hhaW5JZF8EaWR4XwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUYS0VZX1dBVkVTX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgkApAMBBQRpZHhfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARxfbG9hZEVWTUV2ZW50RXhlY3V0b3JJZHhTaXplARFleGVjdXRpb25DaGFpbklkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUWS0VZX0VWTV9FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEcX3NhdmVFVk1FdmVudEV4ZWN1dG9ySWR4U2l6ZQIRZXhlY3V0aW9uQ2hhaW5JZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFktFWV9FVk1fRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEYX2xvYWRFVk1FdmVudEV4ZWN1dG9ySWR4AhFleGVjdXRpb25DaGFpbklkXwRpZHhfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRZLRVlfRVZNX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgkApAMBBQRpZHhfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEYX3NhdmVFVk1FdmVudEV4ZWN1dG9ySWR4AxFleGVjdXRpb25DaGFpbklkXwRpZHhfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRZLRVlfRVZNX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgkApAMBBQRpZHhfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsAQ5fbG9hZFdpdG5lc3NlcwIOY2FsbGVyQ2hhaW5JZF8GZXBvY2hfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBRdLRVlfV0lUTkVTU0VTX1BFUl9FUE9DSAkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUGZXBvY2hfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQBmAgkAsQIBBQFhAAAJALUJAgUBYQUJU0VQQVJBVE9SBQNuaWwFA25pbAEOX3NhdmVXaXRuZXNzZXMDDmNhbGxlckNoYWluSWRfBmVwb2NoXwp3aXRuZXNzZXNfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRdLRVlfV0lUTkVTU0VTX1BFUl9FUE9DSAkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUGZXBvY2hfBQNuaWwFCVNFUEFSQVRPUgkAuQkCBQp3aXRuZXNzZXNfBQlTRVBBUkFUT1IFA25pbAEXX2xvYWRSZXdhcmRUb2tlbkFkZHJlc3MABAckbWF0Y2gwCQCiCAEFGEtFWV9SRVdBUkRfVE9LRU5fQUREUkVTUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARdfc2F2ZVJld2FyZFRva2VuQWRkcmVzcwEEdmFsXwkAzAgCCQELU3RyaW5nRW50cnkCBRhLRVlfUkVXQVJEX1RPS0VOX0FERFJFU1MJAKUIAQUEdmFsXwUDbmlsARFfbG9hZFJld2FyZEFtb3VudAAEByRtYXRjaDAJAJ8IAQURS0VZX1JFV0FSRF9BTU9VTlQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlUmV3YXJkQW1vdW50AQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFLRVlfUkVXQVJEX0FNT1VOVAUEdmFsXwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQAAwkBCV9sb2FkSW5pdAAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAMJAQEhAQkBCV9sb2FkSW5pdAAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGARBfaXNBY3RpdmVXaXRuZXNzAwpwdWJsaWNLZXlfC3B1YmxpY0tleXNfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQtwdWJsaWNLZXlzXwUKcHVibGljS2V5XwkAAgEFBGVycl8GARdfbm90Q29uZmlybWVkV2F2ZXNFdmVudAIKZXZlbnRIYXNoXwRlcnJfAwkAZgIJARVfbG9hZFdhdmVzRXZlbnRTdGF0dXMBBQpldmVudEhhc2hfBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkAAgEFBGVycl8GARVfbm90Q29uZmlybWVkRVZNRXZlbnQCCmV2ZW50SGFzaF8EZXJyXwMJAGYCCQETX2xvYWRFVk1FdmVudFN0YXR1cwEFCmV2ZW50SGFzaF8FF0VWRU5UX1NUQVRVU19QUk9DRVNTSU5HCQACAQUEZXJyXwYBE193YXZlc0V2ZW50Tm90RXhpc3QCCmV2ZW50SGFzaF8EZXJyXwMJAQIhPQIJARVfbG9hZFdhdmVzRXZlbnRTdGF0dXMBBQpldmVudEhhc2hfAAAJAAIBBQRlcnJfBgERX2V2bUV2ZW50Tm90RXhpc3QCCmV2ZW50SGFzaF8EZXJyXwMJAQIhPQIJARNfbG9hZEVWTUV2ZW50U3RhdHVzAQUKZXZlbnRIYXNoXwAACQACAQUEZXJyXwYBIF9ub3RQdWJsaXNoZWRXYXZlc0V2ZW50QnlXaXRuZXNzAwpwdWJsaWNLZXlfCGV2ZW50SWRfBGVycl8DCQECIT0CCQEhX2xvYWRQdWJsaXNoZWRXYXZlc0V2ZW50QnlXaXRuZXNzAgUKcHVibGljS2V5XwUIZXZlbnRJZF8AAAkAAgEFBGVycl8GAR5fbm90UHVibGlzaGVkRVZNRXZlbnRCeVdpdG5lc3MDCnB1YmxpY0tleV8IZXZlbnRJZF8EZXJyXwMJAGYCCQEfX2xvYWRQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwIFCnB1YmxpY0tleV8FCGV2ZW50SWRfAAAJAAIBBQRlcnJfBgEQX2lzUXVvcnVtUmVhY2hlZAMOY29uZmlybWF0aW9uc18GdG90YWxfDHdpdG5lc3NTaXplXwMDCQBmAgUOY29uZmlybWF0aW9uc18JAGkCBQx3aXRuZXNzU2l6ZV8AAgYJAGYCCQBlAgUGdG90YWxfBQ5jb25maXJtYXRpb25zXwkAaQIFDHdpdG5lc3NTaXplXwACBgcBD19nZXRFdmVudFN0YXR1cwMOY29uZmlybWF0aW9uc18GdG90YWxfDHdpdG5lc3NTaXplXwMJAGYCBQ5jb25maXJtYXRpb25zXwkAaQIFDHdpdG5lc3NTaXplXwACBRZFVkVOVF9TVEFUVVNfQ09ORklSTUVEAwkAZgIJAGUCBQZ0b3RhbF8FDmNvbmZpcm1hdGlvbnNfCQBpAgUMd2l0bmVzc1NpemVfAAIFFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAUXRVZFTlRfU1RBVFVTX1BST0NFU1NJTkcBD19jaGVja0V2ZW50VHlwZQMRZXhlY3V0aW9uQ2hhaW5JZF8FdHlwZV8EZXJyXwMJAQIhPQIJAQ5fbG9hZEV2ZW50VHlwZQEFEWV4ZWN1dGlvbkNoYWluSWRfBQV0eXBlXwkAAgEFBGVycl8GARNfY2FsY1dhdmVzRXZlbnRIYXNoAQZldmVudF8ECmV2ZW50Qnl0ZXMJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAmgMBCAUGZXZlbnRfAl8xCQCaAwEIBQZldmVudF8CXzIJAJoDAQgFBmV2ZW50XwJfMwkAmwMBCAUGZXZlbnRfAl80CQCbAwEIBQZldmVudF8CXzUJAJsDAQkAuQkCCAUGZXZlbnRfAl82BQ5BUkdTX1NFUEFSQVRPUgkAmwMBCAUGZXZlbnRfAl83CQCaAwEIBQZldmVudF8CXzgJANgEAQkAjBUBBQpldmVudEJ5dGVzARFfY2FsY0VWTUV2ZW50SGFzaAEGZXZlbnRfBApldmVudEJ5dGVzCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQCaAwEIBQZldmVudF8CXzEJAJoDAQgFBmV2ZW50XwJfMgkAmgMBCAUGZXZlbnRfAl8zCQCbAwEIBQZldmVudF8CXzQJAJsDAQgFBmV2ZW50XwJfNQkAmwMBCAUGZXZlbnRfAl82CQCaAwEIBQZldmVudF8CXzcJANgEAQkAjBUBBQpldmVudEJ5dGVzARJfc2V0V2F2ZXNFdmVudEhhc2gCBmV2ZW50XwVoYXNoXwkAnwoNCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83CAUGZXZlbnRfAl84BQVoYXNoXwgFBmV2ZW50XwNfMTAIBQZldmVudF8DXzExCAUGZXZlbnRfA18xMggFBmV2ZW50XwNfMTMBEF9zZXRFVk1FdmVudEhhc2gCBmV2ZW50XwVoYXNoXwkAngoMCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83BQVoYXNoXwgFBmV2ZW50XwJfOQgFBmV2ZW50XwNfMTAIBQZldmVudF8DXzExCAUGZXZlbnRfA18xMgEbX3NldFdhdmVzRXZlbnRDb25maXJtYXRpb25zAwZldmVudF8OY29uZmlybWF0aW9uc18GdG90YWxfCQCfCg0IBQZldmVudF8CXzEIBQZldmVudF8CXzIIBQZldmVudF8CXzMIBQZldmVudF8CXzQIBQZldmVudF8CXzUIBQZldmVudF8CXzYIBQZldmVudF8CXzcIBQZldmVudF8CXzgIBQZldmVudF8CXzkFDmNvbmZpcm1hdGlvbnNfBQZ0b3RhbF8IBQZldmVudF8DXzEyCAUGZXZlbnRfA18xMwEZX3NldEVWTUV2ZW50Q29uZmlybWF0aW9ucwMGZXZlbnRfDmNvbmZpcm1hdGlvbnNfBnRvdGFsXwkAngoMCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83CAUGZXZlbnRfAl84BQ5jb25maXJtYXRpb25zXwUGdG90YWxfCAUGZXZlbnRfA18xMQgFBmV2ZW50XwNfMTILAWkBBGluaXQDFXByb3h5U2VjRGVwb1BlckV2ZW50XxNyZXdhcmRUb2tlbkFkZHJlc3NfDXJld2FyZEFtb3VudF8EA2VycgMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJAQxfdmFsaWRhdGVJbnQEBRVwcm94eVNlY0RlcG9QZXJFdmVudF8AAAUHTUFYX0lOVAIiaW5pdDogaW52YWxpZCBwcm94eVNlY0RlcG9QZXJFdmVudAcJARBfdmFsaWRhdGVBZGRyZXNzAgUTcmV3YXJkVG9rZW5BZGRyZXNzXwIgaW5pdDogaW52YWxpZCByZXdhcmRUb2tlbkFkZHJlc3MHCQEMX3ZhbGlkYXRlSW50BAUNcmV3YXJkQW1vdW50XwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHJld2FyZEFtb3VudAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQDOCAIJAM4IAgkBCV9zYXZlSW5pdAEGCQEZX3NhdmVQcm94eVNlY0RlcG9QZXJFdmVudAEFFXByb3h5U2VjRGVwb1BlckV2ZW50XwkBF19zYXZlUmV3YXJkVG9rZW5BZGRyZXNzAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUTcmV3YXJkVG9rZW5BZGRyZXNzXwkBEV9zYXZlUmV3YXJkQW1vdW50AQUNcmV3YXJkQW1vdW50XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJzZXRBY3RpdmVXaXRuZXNzZXMCDmNhbGxlckNoYWluSWRfCndpdG5lc3Nlc18EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARNfdmFsaWRhdGVQdWJsaWNLZXlzAgUKd2l0bmVzc2VzXwIlc2V0QWN0aXZlV2l0bmVzc2VzOiBpbnZhbGlkIHdpdG5lc3NlcwcDCQAAAgUDZXJyBQNlcnIEBWVwb2NoCQERX2xvYWRDdXJyZW50RXBvY2gBBQ5jYWxsZXJDaGFpbklkXwkAlAoCCQDOCAIJARFfc2F2ZUN1cnJlbnRFcG9jaAIFDmNhbGxlckNoYWluSWRfCQBkAgUFZXBvY2gAAQkBDl9zYXZlV2l0bmVzc2VzAwUOY2FsbGVyQ2hhaW5JZF8JAGQCBQVlcG9jaAABBQp3aXRuZXNzZXNfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHN1Ym1pdFdhdmVzQ2FsbEV2ZW50CA5jYWxsZXJDaGFpbklkXxFleGVjdXRpb25DaGFpbklkXwZub25jZV8SZXhlY3V0aW9uQ29udHJhY3RfDWZ1bmN0aW9uTmFtZV8FYXJnc18HdHhIYXNoXwxibG9ja051bWJlcl8EA2VycgMDAwMDAwMDCQEMX3ZhbGlkYXRlSW50BAUOY2FsbGVyQ2hhaW5JZF8AAAUHTUFYX0lOVAIrc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IGludmFsaWQgY2FsbGVyQ2hhaW5JZAkBDF92YWxpZGF0ZUludAQFEWV4ZWN1dGlvbkNoYWluSWRfAAAFB01BWF9JTlQCLnN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGV4ZWN1dGlvbkNoYWluSWQHCQEMX3ZhbGlkYXRlSW50BAUGbm9uY2VfAAAFB01BWF9JTlQCI3N1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIG5vbmNlBwkBD192YWxpZGF0ZVN0cmluZwIFEmV4ZWN1dGlvbkNvbnRyYWN0XwIvc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IGludmFsaWQgZXhlY3V0aW9uQ29udHJhY3QHCQEPX3ZhbGlkYXRlU3RyaW5nAgUNZnVuY3Rpb25OYW1lXwIqc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IGludmFsaWQgZnVuY3Rpb25OYW1lBwkBDV92YWxpZGF0ZUFyZ3MCBQVhcmdzXwIic3VibWl0V2F2ZXNDYWxsRXZlbnQ6IGludmFsaWQgYXJncwcJAQ9fdmFsaWRhdGVTdHJpbmcCBQd0eEhhc2hfAiRzdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCB0eEhhc2gHCQEMX3ZhbGlkYXRlSW50BAUMYmxvY2tOdW1iZXJfAAAFB01BWF9JTlQCKXN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBpbnZhbGlkIGJsb2NrTnVtYmVyBwkBD19jaGVja0V2ZW50VHlwZQMFEWV4ZWN1dGlvbkNoYWluSWRfBRBFVkVOVF9UWVBFX1dBVkVTAiJzdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCB0eXBlBwMJAAACBQNlcnIFA2VycgQMcHJveHlTZWNEZXBvCQERX2xvYWRQcm94eVNlY0RlcG8BCAUBaQZjYWxsZXIEFHByb3h5U2VjRGVwb1BlckV2ZW50CQEZX2xvYWRQcm94eVNlY0RlcG9QZXJFdmVudAAEE3Byb3h5U2VjRGVwb1VwZGF0ZWQJAGUCBQxwcm94eVNlY0RlcG8FFHByb3h5U2VjRGVwb1BlckV2ZW50BAVldmVudAkAnwoNBQ5jYWxsZXJDaGFpbklkXwURZXhlY3V0aW9uQ2hhaW5JZF8FBm5vbmNlXwUSZXhlY3V0aW9uQ29udHJhY3RfBQ1mdW5jdGlvbk5hbWVfBQVhcmdzXwUHdHhIYXNoXwUMYmxvY2tOdW1iZXJfAgAAAAAABRRwcm94eVNlY0RlcG9QZXJFdmVudAgFAWkGY2FsbGVyBAlldmVudFNpemUJARNfbG9hZFdhdmVzRXZlbnRTaXplAAQJZXZlbnRIYXNoCQETX2NhbGNXYXZlc0V2ZW50SGFzaAEFBWV2ZW50BAxldmVudFVwZGF0ZWQJARJfc2V0V2F2ZXNFdmVudEhhc2gCBQVldmVudAUJZXZlbnRIYXNoBARlcnIxAwkBE193YXZlc0V2ZW50Tm90RXhpc3QCBQlldmVudEhhc2gCJHN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBhbHJlYWR5IGV4aXN0cwkBDF92YWxpZGF0ZUludAQFE3Byb3h5U2VjRGVwb1VwZGF0ZWQAAAUHTUFYX0lOVAIpc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IG5vIHNlY3VyaXR5IGRlcG9zaXQHAwkAAAIFBGVycjEFBGVycjEEDWNhbGxlcklkeFNpemUJARxfbG9hZFdhdmVzRXZlbnRDYWxsZXJJZHhTaXplAQUOY2FsbGVyQ2hhaW5JZF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJARFfc2F2ZVByb3h5U2VjRGVwbwIIBQFpBmNhbGxlcgUTcHJveHlTZWNEZXBvVXBkYXRlZAkBD19zYXZlV2F2ZXNFdmVudAIFCWV2ZW50U2l6ZQUMZXZlbnRVcGRhdGVkCQEVX3NhdmVXYXZlc0V2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkBE19zYXZlV2F2ZXNFdmVudFNpemUBCQBkAgUJZXZlbnRTaXplAAEJARhfc2F2ZVdhdmVzRXZlbnRDYWxsZXJJZHgDBQ5jYWxsZXJDaGFpbklkXwUNY2FsbGVySWR4U2l6ZQUJZXZlbnRTaXplCQEcX3NhdmVXYXZlc0V2ZW50Q2FsbGVySWR4U2l6ZQIFDmNhbGxlckNoYWluSWRfCQBkAgUNY2FsbGVySWR4U2l6ZQABBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnN1Ym1pdEVWTUNhbGxFdmVudAcOY2FsbGVyQ2hhaW5JZF8RZXhlY3V0aW9uQ2hhaW5JZF8Gbm9uY2VfEmV4ZWN1dGlvbkNvbnRyYWN0XwljYWxsZGF0YV8HdHhIYXNoXwxibG9ja051bWJlcl8EA2VycgMDAwMDAwMJAQxfdmFsaWRhdGVJbnQEBQ5jYWxsZXJDaGFpbklkXwAABQdNQVhfSU5UAilzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgY2FsbGVyQ2hhaW5JZAkBDF92YWxpZGF0ZUludAQFEWV4ZWN1dGlvbkNoYWluSWRfAAAFB01BWF9JTlQCLHN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBleGVjdXRpb25DaGFpbklkBwkBDF92YWxpZGF0ZUludAQFBm5vbmNlXwAABQdNQVhfSU5UAiFzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgbm9uY2UHCQEPX3ZhbGlkYXRlU3RyaW5nAgUSZXhlY3V0aW9uQ29udHJhY3RfAi1zdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgZXhlY3V0aW9uQ29udHJhY3QHCQEPX3ZhbGlkYXRlU3RyaW5nAgUJY2FsbGRhdGFfAiRzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgY2FsbGRhdGEHCQEPX3ZhbGlkYXRlU3RyaW5nAgUHdHhIYXNoXwIic3VibWl0RVZNQ2FsbEV2ZW50OiBpbnZhbGlkIHR4SGFzaAcJAQxfdmFsaWRhdGVJbnQEBQxibG9ja051bWJlcl8AAAUHTUFYX0lOVAInc3VibWl0RVZNQ2FsbEV2ZW50OiBpbnZhbGlkIGJsb2NrTnVtYmVyBwkBD19jaGVja0V2ZW50VHlwZQMFEWV4ZWN1dGlvbkNoYWluSWRfBQ5FVkVOVF9UWVBFX0VWTQIgc3VibWl0RVZNQ2FsbEV2ZW50OiBpbnZhbGlkIHR5cGUHAwkAAAIFA2VycgUDZXJyBAxwcm94eVNlY0RlcG8JARFfbG9hZFByb3h5U2VjRGVwbwEIBQFpBmNhbGxlcgQUcHJveHlTZWNEZXBvUGVyRXZlbnQJARlfbG9hZFByb3h5U2VjRGVwb1BlckV2ZW50AAQTcHJveHlTZWNEZXBvVXBkYXRlZAkAZQIFDHByb3h5U2VjRGVwbwUUcHJveHlTZWNEZXBvUGVyRXZlbnQEBWV2ZW50CQCeCgwFDmNhbGxlckNoYWluSWRfBRFleGVjdXRpb25DaGFpbklkXwUGbm9uY2VfBRJleGVjdXRpb25Db250cmFjdF8FCWNhbGxkYXRhXwUHdHhIYXNoXwUMYmxvY2tOdW1iZXJfAgAAAAAABRRwcm94eVNlY0RlcG9QZXJFdmVudAgFAWkGY2FsbGVyBAlldmVudFNpemUJARFfbG9hZEVWTUV2ZW50U2l6ZQAECWV2ZW50SGFzaAkBEV9jYWxjRVZNRXZlbnRIYXNoAQUFZXZlbnQEDGV2ZW50VXBkYXRlZAkBEF9zZXRFVk1FdmVudEhhc2gCBQVldmVudAUJZXZlbnRIYXNoBARlcnIxAwkBEV9ldm1FdmVudE5vdEV4aXN0AgUJZXZlbnRIYXNoAiJzdWJtaXRFVk1DYWxsRXZlbnQ6IGFscmVhZHkgZXhpc3RzCQEMX3ZhbGlkYXRlSW50BAUTcHJveHlTZWNEZXBvVXBkYXRlZAAABQdNQVhfSU5UAidzdWJtaXRFVk1DYWxsRXZlbnQ6IG5vIHNlY3VyaXR5IGRlcG9zaXQHAwkAAAIFBGVycjEFBGVycjEEDWNhbGxlcklkeFNpemUJARpfbG9hZEVWTUV2ZW50Q2FsbGVySWR4U2l6ZQEFDmNhbGxlckNoYWluSWRfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQERX3NhdmVQcm94eVNlY0RlcG8CCAUBaQZjYWxsZXIFE3Byb3h5U2VjRGVwb1VwZGF0ZWQJAQ1fc2F2ZUVWTUV2ZW50AgUJZXZlbnRTaXplBQxldmVudFVwZGF0ZWQJARNfc2F2ZUVWTUV2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkBEV9zYXZlRVZNRXZlbnRTaXplAQkAZAIFCWV2ZW50U2l6ZQABCQEWX3NhdmVFVk1FdmVudENhbGxlcklkeAMFDmNhbGxlckNoYWluSWRfBQ1jYWxsZXJJZHhTaXplBQlldmVudFNpemUJARpfc2F2ZUVWTUV2ZW50Q2FsbGVySWR4U2l6ZQIFDmNhbGxlckNoYWluSWRfCQBkAgUNY2FsbGVySWR4U2l6ZQABBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF3B1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzAglldmVudElkeF8Hc3RhdHVzXwQJZXZlbnRTaXplCQETX2xvYWRXYXZlc0V2ZW50U2l6ZQAED2NhbGxlclB1YmxpY0tleQkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEA2VycgMJARFfdmFsaWRhdGVFdmVudElkeAMFCWV2ZW50SWR4XwUJZXZlbnRTaXplAipwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogaW52YWxpZCBldmVudCBpZHgJARRfdmFsaWRhdGVFdmVudFN0YXR1cwIFB3N0YXR1c18CJ3B1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBpbnZhbGlkIHN0YXR1cwcDCQAAAgUDZXJyBQNlcnIEBWV2ZW50CQEPX2xvYWRXYXZlc0V2ZW50AQUJZXZlbnRJZHhfBA1jYWxsZXJDaGFpbklkCAUFZXZlbnQCXzEEEGV4ZWN1dGlvbkNoYWluSWQIBQVldmVudAJfMgQJZXZlbnRIYXNoCAUFZXZlbnQCXzkEEmV2ZW50Q29uZmlybWF0aW9ucwgFBWV2ZW50A18xMAQKZXZlbnRUb3RhbAgFBWV2ZW50A18xMQQMcHJveHlTZWNEZXBvCAUFZXZlbnQDXzEyBAVwcm94eQgFBWV2ZW50A18xMwQFZXBvY2gJARFfbG9hZEN1cnJlbnRFcG9jaAEFDWNhbGxlckNoYWluSWQED2FjdGl2ZVdpdG5lc3NlcwkBDl9sb2FkV2l0bmVzc2VzAgUNY2FsbGVyQ2hhaW5JZAUFZXBvY2gEBGVycjEDAwkBEF9pc0FjdGl2ZVdpdG5lc3MDCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQUPYWN0aXZlV2l0bmVzc2VzAidwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogaW52YWxpZCBjYWxsZXIJARdfbm90Q29uZmlybWVkV2F2ZXNFdmVudAIFCWV2ZW50SGFzaAIwcHVibGlzaFdhdmVzRXZlbnRTdGF0dXM6IGV2ZW50IGFscmVhZHkgY29uZmlybWVkBwkBIF9ub3RQdWJsaXNoZWRXYXZlc0V2ZW50QnlXaXRuZXNzAwUPY2FsbGVyUHVibGljS2V5BQlldmVudElkeF8CKnB1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBhbHJlYWR5IHB1Ymxpc2hlZAcDCQAAAgUEZXJyMQUEZXJyMQQMZXZlbnRVcGRhdGVkAwkAAAIFB3N0YXR1c18FFkVWRU5UX1NUQVRVU19DT05GSVJNRUQJARtfc2V0V2F2ZXNFdmVudENvbmZpcm1hdGlvbnMDBQVldmVudAkAZAIFEmV2ZW50Q29uZmlybWF0aW9ucwABCQBkAgUKZXZlbnRUb3RhbAABAwkAAAIFB3N0YXR1c18FFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAkBG19zZXRXYXZlc0V2ZW50Q29uZmlybWF0aW9ucwMFBWV2ZW50BRJldmVudENvbmZpcm1hdGlvbnMJAGQCBQpldmVudFRvdGFsAAEJAAIBAilwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogaW5jb3JyZWN0IHN0YXR1cwQPZXhlY3V0b3JJZHhTaXplCQEeX2xvYWRXYXZlc0V2ZW50RXhlY3V0b3JJZHhTaXplAQUQZXhlY3V0aW9uQ2hhaW5JZAQMZmluYWxpemF0aW9uAwkBEF9pc1F1b3J1bVJlYWNoZWQDCAUMZXZlbnRVcGRhdGVkA18xMAgFDGV2ZW50VXBkYXRlZANfMTEJAJADAQUPYWN0aXZlV2l0bmVzc2VzBAZzdGF0dXMJAQ9fZ2V0RXZlbnRTdGF0dXMDCAUMZXZlbnRVcGRhdGVkA18xMAgFDGV2ZW50VXBkYXRlZANfMTEJAJADAQUPYWN0aXZlV2l0bmVzc2VzBA9yZXdhcmRBZGRyZXNzZXMJAMwIAgkApQgBBQVwcm94eQkBFV9wdWJsaWNLZXlzVG9BZGRyc1N0cgEFD2FjdGl2ZVdpdG5lc3NlcwQQd2l0bmVzc2VzUmV3YXJkcwkA/AcECQEXX2xvYWRSZXdhcmRUb2tlbkFkZHJlc3MABQ5GVU5DX01JTlRfTUFOWQkAzAgCCQERX2xvYWRSZXdhcmRBbW91bnQACQDMCAIFD3Jld2FyZEFkZHJlc3NlcwUDbmlsBQNuaWwDCQAAAgUQd2l0bmVzc2VzUmV3YXJkcwUQd2l0bmVzc2VzUmV3YXJkcwMJAAACBQZzdGF0dXMFFkVWRU5UX1NUQVRVU19DT05GSVJNRUQJAM4IAgkAzggCCQDOCAIJARFfc2F2ZVByb3h5U2VjRGVwbwIFBXByb3h5CQBkAgkBEV9sb2FkUHJveHlTZWNEZXBvAQUFcHJveHkFDHByb3h5U2VjRGVwbwkBFV9zYXZlV2F2ZXNFdmVudFN0YXR1cwIFCWV2ZW50SGFzaAUGc3RhdHVzCQEaX3NhdmVXYXZlc0V2ZW50RXhlY3V0b3JJZHgDBRBleGVjdXRpb25DaGFpbklkBQ9leGVjdXRvcklkeFNpemUFCWV2ZW50SWR4XwkBHl9zYXZlV2F2ZXNFdmVudEV4ZWN1dG9ySWR4U2l6ZQIFEGV4ZWN1dGlvbkNoYWluSWQJAGQCBQ9leGVjdXRvcklkeFNpemUAAQMJAAACBQZzdGF0dXMFFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAkAzggCCQEVX3NhdmVXYXZlc0V2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBQZzdGF0dXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDV9sb2FkTXVsdGlzaWcABQxwcm94eVNlY0RlcG8FBHVuaXQFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAJQKAgkAzggCCQDOCAIJAQ9fc2F2ZVdhdmVzRXZlbnQCBQlldmVudElkeF8FDGV2ZW50VXBkYXRlZAkBIV9zYXZlUHVibGlzaGVkV2F2ZXNFdmVudEJ5V2l0bmVzcwMFD2NhbGxlclB1YmxpY0tleQUJZXZlbnRJZHhfBQdzdGF0dXNfBQxmaW5hbGl6YXRpb24FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVcHVibGlzaEVWTUV2ZW50U3RhdHVzAglldmVudElkeF8Hc3RhdHVzXwQJZXZlbnRTaXplCQERX2xvYWRFVk1FdmVudFNpemUABA9jYWxsZXJQdWJsaWNLZXkJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BANlcnIDCQERX3ZhbGlkYXRlRXZlbnRJZHgDBQlldmVudElkeF8FCWV2ZW50U2l6ZQIocHVibGlzaEVWTUV2ZW50U3RhdHVzOiBpbnZhbGlkIGV2ZW50IGlkeAkBFF92YWxpZGF0ZUV2ZW50U3RhdHVzAgUHc3RhdHVzXwIlcHVibGlzaEVWTUV2ZW50U3RhdHVzOiBpbnZhbGlkIHN0YXR1cwcDCQAAAgUDZXJyBQNlcnIEBWV2ZW50CQENX2xvYWRFVk1FdmVudAEFCWV2ZW50SWR4XwQNY2FsbGVyQ2hhaW5JZAgFBWV2ZW50Al8xBBBleGVjdXRpb25DaGFpbklkCAUFZXZlbnQCXzIECWV2ZW50SGFzaAgFBWV2ZW50Al84BBJldmVudENvbmZpcm1hdGlvbnMIBQVldmVudAJfOQQKZXZlbnRUb3RhbAgFBWV2ZW50A18xMAQMcHJveHlTZWNEZXBvCAUFZXZlbnQDXzExBAVwcm94eQgFBWV2ZW50A18xMgQFZXBvY2gJARFfbG9hZEN1cnJlbnRFcG9jaAEFDWNhbGxlckNoYWluSWQED2FjdGl2ZVdpdG5lc3NlcwkBDl9sb2FkV2l0bmVzc2VzAgUNY2FsbGVyQ2hhaW5JZAUFZXBvY2gEBGVycjEDAwkBEF9pc0FjdGl2ZVdpdG5lc3MDCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQUPYWN0aXZlV2l0bmVzc2VzAiVwdWJsaXNoRVZNRXZlbnRTdGF0dXM6IGludmFsaWQgY2FsbGVyCQEVX25vdENvbmZpcm1lZEVWTUV2ZW50AgUJZXZlbnRIYXNoAi5wdWJsaXNoRVZNRXZlbnRTdGF0dXM6IGV2ZW50IGFscmVhZHkgY29uZmlybWVkBwkBHl9ub3RQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwMFD2NhbGxlclB1YmxpY0tleQUJZXZlbnRJZHhfAihwdWJsaXNoRVZNRXZlbnRTdGF0dXM6IGFscmVhZHkgcHVibGlzaGVkBwMJAAACBQRlcnIxBQRlcnIxBAxldmVudFVwZGF0ZWQDCQAAAgUHc3RhdHVzXwUWRVZFTlRfU1RBVFVTX0NPTkZJUk1FRAkBGV9zZXRFVk1FdmVudENvbmZpcm1hdGlvbnMDBQVldmVudAkAZAIFEmV2ZW50Q29uZmlybWF0aW9ucwABCQBkAgUKZXZlbnRUb3RhbAABAwkAAAIFB3N0YXR1c18FFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAkBGV9zZXRFVk1FdmVudENvbmZpcm1hdGlvbnMDBQVldmVudAUSZXZlbnRDb25maXJtYXRpb25zCQBkAgUKZXZlbnRUb3RhbAABCQACAQIncHVibGlzaEVWTUV2ZW50U3RhdHVzOiBpbmNvcnJlY3Qgc3RhdHVzBA9leGVjdXRvcklkeFNpemUJARxfbG9hZEVWTUV2ZW50RXhlY3V0b3JJZHhTaXplAQUQZXhlY3V0aW9uQ2hhaW5JZAQMZmluYWxpemF0aW9uAwkBEF9pc1F1b3J1bVJlYWNoZWQDCAUMZXZlbnRVcGRhdGVkAl85CAUMZXZlbnRVcGRhdGVkA18xMAkAkAMBBQ9hY3RpdmVXaXRuZXNzZXMEBnN0YXR1cwkBD19nZXRFdmVudFN0YXR1cwMIBQxldmVudFVwZGF0ZWQCXzkIBQxldmVudFVwZGF0ZWQDXzEwCQCQAwEFD2FjdGl2ZVdpdG5lc3NlcwQPcmV3YXJkQWRkcmVzc2VzCQDMCAIJAKUIAQUFcHJveHkJARVfcHVibGljS2V5c1RvQWRkcnNTdHIBBQ9hY3RpdmVXaXRuZXNzZXMEEHdpdG5lc3Nlc1Jld2FyZHMJAPwHBAkBF19sb2FkUmV3YXJkVG9rZW5BZGRyZXNzAAUORlVOQ19NSU5UX01BTlkJAMwIAgkBEV9sb2FkUmV3YXJkQW1vdW50AAkAzAgCBQ9yZXdhcmRBZGRyZXNzZXMFA25pbAUDbmlsAwkAAAIFEHdpdG5lc3Nlc1Jld2FyZHMFEHdpdG5lc3Nlc1Jld2FyZHMDCQAAAgUGc3RhdHVzBRZFVkVOVF9TVEFUVVNfQ09ORklSTUVECQDOCAIJAM4IAgkAzggCCQERX3NhdmVQcm94eVNlY0RlcG8CBQVwcm94eQkAZAIJARFfbG9hZFByb3h5U2VjRGVwbwEFBXByb3h5BQxwcm94eVNlY0RlcG8JARNfc2F2ZUVWTUV2ZW50U3RhdHVzAgUJZXZlbnRIYXNoBQZzdGF0dXMJARhfc2F2ZUVWTUV2ZW50RXhlY3V0b3JJZHgDBRBleGVjdXRpb25DaGFpbklkBQ9leGVjdXRvcklkeFNpemUFCWV2ZW50SWR4XwkBHF9zYXZlRVZNRXZlbnRFeGVjdXRvcklkeFNpemUCBRBleGVjdXRpb25DaGFpbklkCQBkAgUPZXhlY3V0b3JJZHhTaXplAAEDCQAAAgUGc3RhdHVzBRVFVkVOVF9TVEFUVVNfUkVKRUNURUQJAM4IAgkBE19zYXZlRVZNRXZlbnRTdGF0dXMCBQlldmVudEhhc2gFBnN0YXR1cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQENX2xvYWRNdWx0aXNpZwAFDHByb3h5U2VjRGVwbwUEdW5pdAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAlAoCCQDOCAIJAM4IAgkBDV9zYXZlRVZNRXZlbnQCBQlldmVudElkeF8FDGV2ZW50VXBkYXRlZAkBH19zYXZlUHVibGlzaGVkRVZNRXZlbnRCeVdpdG5lc3MDBQ9jYWxsZXJQdWJsaWNLZXkFCWV2ZW50SWR4XwUHc3RhdHVzXwUMZmluYWxpemF0aW9uBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF2FkZFByb3h5U2VjdXJpdHlEZXBvc2l0AQpyZWNpcGllbnRfBAlyZWNpcGllbnQDCQAAAgUKcmVjaXBpZW50XwIACQClCAEIBQFpBmNhbGxlcgUKcmVjaXBpZW50XwQDZXJyAwMJARBfdmFsaWRhdGVBZGRyZXNzAgUJcmVjaXBpZW50AiphZGRQcm94eVNlY3VyaXR5RGVwb3NpdDogaW52YWxpZCByZWNpcGllbnQJARVfdmFsaWRhdGVQYXltZW50c1NpemUDCAUBaQhwYXltZW50cwABAiNhZGRQcm94eVNlY3VyaXR5RGVwb3NpdDogbm8gcGF5bWVudAcJARVfdmFsaWRhdGVQYXltZW50QXNzZXQDCQCRAwIIBQFpCHBheW1lbnRzAAAFBHVuaXQCJmFkZFByb3h5U2VjdXJpdHlEZXBvc2l0OiBpbnZhbGlkIGFzc2V0BwMJAAACBQNlcnIFA2VycgQNcmVjaXBpZW50QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcmVjaXBpZW50BAdiYWxhbmNlCQERX2xvYWRQcm94eVNlY0RlcG8BBQ1yZWNpcGllbnRBZGRyBA51cGRhdGVkQmFsYW5jZQkAZAIFB2JhbGFuY2UICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQCUCgIJARFfc2F2ZVByb3h5U2VjRGVwbwIFDXJlY2lwaWVudEFkZHIFDnVwZGF0ZWRCYWxhbmNlBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF3N1YlByb3h5U2VjdXJpdHlEZXBvc2l0AQdhbW91bnRfBAdiYWxhbmNlCQERX2xvYWRQcm94eVNlY0RlcG8BCAUBaQZjYWxsZXIDCQBmAgUHYW1vdW50XwUHYmFsYW5jZQkAAgECLXN1YlByb3h5U2VjdXJpdHlEZXBvc2l0OiBpbnN1ZmZpY2llbnQgYmFsYW5jZQkAlAoCCQDOCAIJARFfc2F2ZVByb3h5U2VjRGVwbwIIBQFpBmNhbGxlcgkAZQIFB2JhbGFuY2UFB2Ftb3VudF8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdhbW91bnRfBQR1bml0BQNuaWwFBHVuaXQBaQEMc2V0RXZlbnRUeXBlAgxleGVjQ2hhaW5JZF8FdHlwZV8EA2VycgMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEMX3ZhbGlkYXRlSW50BAUMZXhlY0NoYWluSWRfAAAFB01BWF9JTlQCIXNldEV2ZW50VHlwZTogaW52YWxpZCBleGVjQ2hhaW5JZAcJARJfdmFsaWRhdGVFdmVudFR5cGUCBQV0eXBlXwIgc2V0RXZlbnRUeXBlOiBpbnZhbGlkIGV2ZW50IHR5cGUHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ5fc2F2ZUV2ZW50VHlwZQIFDGV4ZWNDaGFpbklkXwUFdHlwZV8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQaXNDb25maXJtZWRFdmVudAIIZXZlbnRJZF8MZXhlY0NoYWluSWRfBAR0eXBlCQEOX2xvYWRFdmVudFR5cGUBBQxleGVjQ2hhaW5JZF8EBnN0YXR1cwMJAAACBQR0eXBlBRBFVkVOVF9UWVBFX1dBVkVTBAVldmVudAkBD19sb2FkV2F2ZXNFdmVudAEFCGV2ZW50SWRfCQEVX2xvYWRXYXZlc0V2ZW50U3RhdHVzAQgFBWV2ZW50Al85AwkAAAIFBHR5cGUFDkVWRU5UX1RZUEVfRVZNBAVldmVudAkBDV9sb2FkRVZNRXZlbnQBBQhldmVudElkXwkBE19sb2FkRVZNRXZlbnRTdGF0dXMBCAUFZXZlbnQCXzgAAAQDZXJyCQEUX3ZhbGlkYXRlRXZlbnRTdGF0dXMCBQZzdGF0dXMCH2lzQ29uZmlybWVkRXZlbnQ6IG5vIHN1Y2ggZXZlbnQDCQAAAgUDZXJyBQNlcnIDCQAAAgUGc3RhdHVzBRZFVkVOVF9TVEFUVVNfQ09ORklSTUVECQCUCgIFA25pbAYJAJQKAgUDbmlsBwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAiVzZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZyBhZGRyZXNzBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQlTRVBBUkFUT1IHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V57/adZg==", "height": 2491581, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CpNGFhzrVbyxptEKiGTTSUTuCn6ug1F4bRRDgyqq6jq7 Next: BPKzkz8jbY8vaShrYrbZo7UW6fxZkXjgyNid5B9xbCC2 Diff:
OldNewDifferences
1414 let KEY_PROXY_SEC_DEPO = "PROXY_SECURITY_DEPOSIT"
1515
1616 let KEY_PROXY_SEC_DEPO_PER_EVENT = "PROXY_SECURITY_DEPOSIT_PER_EVENT"
17+
18+let KEY_EVENT_TYPE = "EVENT_TYPE"
1719
1820 let KEY_WAVES_EVENT = "WAVES_EVENT"
1921
5052 let KEY_REWARD_AMOUNT = "REWARD_AMOUNT"
5153
5254 let FUNC_MINT_MANY = "mintMany"
55+
56+let EVENT_TYPE_WAVES = "WAVES"
57+
58+let EVENT_TYPE_EVM = "EVM"
5359
5460 let EVENT_STATUS_PROCESSING = 1
5561
173179 }
174180
175181
182+func _validateEventType (type_,err_) = if (if ((type_ != EVENT_TYPE_WAVES))
183+ then (type_ != EVENT_TYPE_EVM)
184+ else false)
185+ then throw(err_)
186+ else true
187+
188+
176189 func _publicKeysToAddrsStr (publicKeys_) = {
177190 func foldfunc (acc_,elem_) = (acc_ :+ toString(addressFromPublicKey(fromBase58String(elem_))))
178191
279292
280293
281294 func _saveEVMEvent (index_,event_) = [StringEntry(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, event_._6, toString(event_._7), event_._8, toString(event_._9), toString(event_._10), toString(event_._11), toString(event_._12)], SEPARATOR))]
295+
296+
297+func _loadEventType (execChainId_) = match getString(makeString([KEY_EVENT_TYPE, toString(execChainId_)], SEPARATOR)) {
298+ case a: String =>
299+ a
300+ case _ =>
301+ ""
302+}
303+
304+
305+func _saveEventType (execChainId_,val_) = [StringEntry(makeString([KEY_EVENT_TYPE, toString(execChainId_)], SEPARATOR), val_)]
282306
283307
284308 func _loadWavesEventStatus (eventHash_) = match getInteger(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR)) {
528552 else EVENT_STATUS_PROCESSING
529553
530554
555+func _checkEventType (executionChainId_,type_,err_) = if ((_loadEventType(executionChainId_) != type_))
556+ then throw(err_)
557+ else true
558+
559+
531560 func _calcWavesEventHash (event_) = {
532561 let eventBytes = (((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(makeString(event_._6, ARGS_SEPARATOR))) + toBytes(event_._7)) + toBytes(event_._8))
533562 toBase58String(keccak256_16Kb(eventBytes))
591620
592621 @Callable(i)
593622 func submitWavesCallEvent (callerChainId_,executionChainId_,nonce_,executionContract_,functionName_,args_,txHash_,blockNumber_) = {
594- let err = if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid callerChainId"))
623+ let err = if (if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid callerChainId"))
595624 then _validateInt(executionChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid executionChainId")
596625 else false)
597626 then _validateInt(nonce_, 0, MAX_INT, "submitWavesCallEvent: invalid nonce")
605634 then _validateString(txHash_, "submitWavesCallEvent: invalid txHash")
606635 else false)
607636 then _validateInt(blockNumber_, 0, MAX_INT, "submitWavesCallEvent: invalid blockNumber")
637+ else false)
638+ then _checkEventType(executionChainId_, EVENT_TYPE_WAVES, "submitWavesCallEvent: invalid type")
608639 else false
609640 if ((err == err))
610641 then {
632663
633664 @Callable(i)
634665 func submitEVMCallEvent (callerChainId_,executionChainId_,nonce_,executionContract_,calldata_,txHash_,blockNumber_) = {
635- let err = if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid callerChainId"))
666+ let err = if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid callerChainId"))
636667 then _validateInt(executionChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid executionChainId")
637668 else false)
638669 then _validateInt(nonce_, 0, MAX_INT, "submitEVMCallEvent: invalid nonce")
644675 then _validateString(txHash_, "submitEVMCallEvent: invalid txHash")
645676 else false)
646677 then _validateInt(blockNumber_, 0, MAX_INT, "submitEVMCallEvent: invalid blockNumber")
678+ else false)
679+ then _checkEventType(executionChainId_, EVENT_TYPE_EVM, "submitEVMCallEvent: invalid type")
647680 else false
648681 if ((err == err))
649682 then {
704737 let finalization = if (_isQuorumReached(eventUpdated._10, eventUpdated._11, size(activeWitnesses)))
705738 then {
706739 let status = _getEventStatus(eventUpdated._10, eventUpdated._11, size(activeWitnesses))
707- let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
708- then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
709- else if ((status == EVENT_STATUS_REJECTED))
710- then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
711- else nil
712740 let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
713741 let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
714742 if ((witnessesRewards == witnessesRewards))
715- then (((proxySecDepoUpdated ++ _saveWavesEventStatus(eventHash, status)) ++ _saveWavesEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveWavesEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
743+ then if ((status == EVENT_STATUS_CONFIRMED))
744+ then (((_saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo)) ++ _saveWavesEventStatus(eventHash, status)) ++ _saveWavesEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveWavesEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
745+ else if ((status == EVENT_STATUS_REJECTED))
746+ then (_saveWavesEventStatus(eventHash, status) ++ [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)])
747+ else nil
716748 else throw("Strict value is not equal to itself.")
717749 }
718750 else nil
760792 let finalization = if (_isQuorumReached(eventUpdated._9, eventUpdated._10, size(activeWitnesses)))
761793 then {
762794 let status = _getEventStatus(eventUpdated._9, eventUpdated._10, size(activeWitnesses))
763- let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
764- then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
765- else if ((status == EVENT_STATUS_REJECTED))
766- then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
767- else nil
768795 let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
769796 let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
770797 if ((witnessesRewards == witnessesRewards))
771- then (((proxySecDepoUpdated ++ _saveEVMEventStatus(eventHash, status)) ++ _saveEVMEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveEVMEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
798+ then if ((status == EVENT_STATUS_CONFIRMED))
799+ then (((_saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo)) ++ _saveEVMEventStatus(eventHash, status)) ++ _saveEVMEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveEVMEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
800+ else if ((status == EVENT_STATUS_REJECTED))
801+ then (_saveEVMEventStatus(eventHash, status) ++ [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)])
802+ else nil
772803 else throw("Strict value is not equal to itself.")
773804 }
774805 else nil
814845
815846
816847 @Callable(i)
848+func setEventType (execChainId_,type_) = {
849+ let err = if (if (if (_onlyThisContract(i.caller))
850+ then _whenInitialized()
851+ else false)
852+ then _validateInt(execChainId_, 0, MAX_INT, "setEventType: invalid execChainId")
853+ else false)
854+ then _validateEventType(type_, "setEventType: invalid event type")
855+ else false
856+ if ((err == err))
857+ then $Tuple2(_saveEventType(execChainId_, type_), unit)
858+ else throw("Strict value is not equal to itself.")
859+ }
860+
861+
862+
863+@Callable(i)
864+func isConfirmedEvent (eventId_,execChainId_) = {
865+ let type = _loadEventType(execChainId_)
866+ let status = if ((type == EVENT_TYPE_WAVES))
867+ then {
868+ let event = _loadWavesEvent(eventId_)
869+ _loadWavesEventStatus(event._9)
870+ }
871+ else if ((type == EVENT_TYPE_EVM))
872+ then {
873+ let event = _loadEVMEvent(eventId_)
874+ _loadEVMEventStatus(event._8)
875+ }
876+ else 0
877+ let err = _validateEventStatus(status, "isConfirmedEvent: no such event")
878+ if ((err == err))
879+ then if ((status == EVENT_STATUS_CONFIRMED))
880+ then $Tuple2(nil, true)
881+ else $Tuple2(nil, false)
882+ else throw("Strict value is not equal to itself.")
883+ }
884+
885+
886+
887+@Callable(i)
817888 func setMultisig (multisig_) = {
818889 let err = if (_onlyThisContract(i.caller))
819890 then _validateAddress(multisig_, "setMultisig: invalid multisig address")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEPARATOR = "__"
55
66 let ARGS_SEPARATOR = "####"
77
88 let KEY_INIT = "INIT"
99
1010 let KEY_MULTISIG = "MULTISIG"
1111
1212 let KEY_STATUS = "STATUS"
1313
1414 let KEY_PROXY_SEC_DEPO = "PROXY_SECURITY_DEPOSIT"
1515
1616 let KEY_PROXY_SEC_DEPO_PER_EVENT = "PROXY_SECURITY_DEPOSIT_PER_EVENT"
17+
18+let KEY_EVENT_TYPE = "EVENT_TYPE"
1719
1820 let KEY_WAVES_EVENT = "WAVES_EVENT"
1921
2022 let KEY_EVM_EVENT = "EVM_EVENT"
2123
2224 let KEY_WAVES_EVENT_SIZE = "WAVES_EVENT_SIZE"
2325
2426 let KEY_EVM_EVENT_SIZE = "EVM_EVENT_SIZE"
2527
2628 let KEY_WAVES_EVENT_STATUS = "WAVES_EVENT_STATUS"
2729
2830 let KEY_EVM_EVENT_STATUS = "EVM_EVENT_STATUS"
2931
3032 let KEY_WAVES_EVENT_PUBLISHED = "WAVES_EVENT_PUBLISHED"
3133
3234 let KEY_EVM_EVENT_PUBLISHED = "EVM_EVENT_PUBLISHED"
3335
3436 let KEY_CURRENT_EPOCH = "CURRENT_EPOCH"
3537
3638 let KEY_SIZE = "SIZE"
3739
3840 let KEY_WAVES_EVENT_CALLER = "WAVES_EVENT_CALLER"
3941
4042 let KEY_EVM_EVENT_CALLER = "EVM_EVENT_CALLER"
4143
4244 let KEY_WITNESSES_PER_EPOCH = "WITNESSES_PER_EPOCH"
4345
4446 let KEY_WAVES_EVENT_EXECUTOR = "WAVES_EVENT_EXECUTOR"
4547
4648 let KEY_EVM_EVENT_EXECUTOR = "EVM_EVENT_EXECUTOR"
4749
4850 let KEY_REWARD_TOKEN_ADDRESS = "REWARD_TOKEN_ADDRESS"
4951
5052 let KEY_REWARD_AMOUNT = "REWARD_AMOUNT"
5153
5254 let FUNC_MINT_MANY = "mintMany"
55+
56+let EVENT_TYPE_WAVES = "WAVES"
57+
58+let EVENT_TYPE_EVM = "EVM"
5359
5460 let EVENT_STATUS_PROCESSING = 1
5561
5662 let EVENT_STATUS_CONFIRMED = 2
5763
5864 let EVENT_STATUS_REJECTED = 3
5965
6066 let MAX_INT = 9223372036854775807
6167
6268 func _validateAddress (address_,err_) = match addressFromString(address_) {
6369 case a: Address =>
6470 true
6571 case _ =>
6672 throw(err_)
6773 }
6874
6975
7076 func _validateAsset (assetId_,err_) = match assetInfo(fromBase58String(assetId_)) {
7177 case a: Asset =>
7278 true
7379 case _ =>
7480 throw(err_)
7581 }
7682
7783
7884 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
7985 then true
8086 else (val_ > upperBoundary_))
8187 then throw(err_)
8288 else true
8389
8490
8591 func _validateString (val_,err_) = if (if ((0 >= size(val_)))
8692 then true
8793 else contains(val_, SEPARATOR))
8894 then throw(err_)
8995 else true
9096
9197
9298 func _validateArgString (val_,err_) = if (if (contains(val_, ARGS_SEPARATOR))
9399 then true
94100 else contains(val_, SEPARATOR))
95101 then throw(err_)
96102 else true
97103
98104
99105 func _validateArgs (args_,err_) = if ((size(args_) > 22))
100106 then throw(err_)
101107 else {
102108 func foldFunc (acc,elem) = $Tuple2(if (acc._1)
103109 then _validateArgString(elem, acc._2)
104110 else false, acc._2)
105111
106112 let result = {
107113 let $l = args_
108114 let $s = size($l)
109115 let $acc0 = $Tuple2(true, err_)
110116 func $f0_1 ($a,$i) = if (($i >= $s))
111117 then $a
112118 else foldFunc($a, $l[$i])
113119
114120 func $f0_2 ($a,$i) = if (($i >= $s))
115121 then $a
116122 else throw("List size exceeds 22")
117123
118124 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22)
119125 }
120126 result._1
121127 }
122128
123129
124130 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
125131 then throw(err_)
126132 else true
127133
128134
129135 func _validatePaymentAsset (payment_,asset_,err_) = if ((payment_.assetId != asset_))
130136 then throw(err_)
131137 else true
132138
133139
134140 func _validateEventIdx (val_,max_,err_) = if (if ((0 > val_))
135141 then true
136142 else (val_ >= max_))
137143 then throw(err_)
138144 else true
139145
140146
141147 func _validateEventStatus (val_,err_) = if (if ((EVENT_STATUS_PROCESSING > val_))
142148 then true
143149 else (val_ > EVENT_STATUS_REJECTED))
144150 then throw(err_)
145151 else true
146152
147153
148154 func _validatePublicKey (publicKey_,err_) = if ((size(fromBase58String(publicKey_)) != 32))
149155 then throw(err_)
150156 else true
151157
152158
153159 func _validatePublicKeys (publicKeys_,err_) = {
154160 func foldFunc (acc,elem) = $Tuple2(if (acc._1)
155161 then _validatePublicKey(elem, acc._2)
156162 else false, acc._2)
157163
158164 let result = {
159165 let $l = publicKeys_
160166 let $s = size($l)
161167 let $acc0 = $Tuple2(true, err_)
162168 func $f0_1 ($a,$i) = if (($i >= $s))
163169 then $a
164170 else foldFunc($a, $l[$i])
165171
166172 func $f0_2 ($a,$i) = if (($i >= $s))
167173 then $a
168174 else throw("List size exceeds 10")
169175
170176 $f0_2($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)
171177 }
172178 result._1
173179 }
174180
175181
182+func _validateEventType (type_,err_) = if (if ((type_ != EVENT_TYPE_WAVES))
183+ then (type_ != EVENT_TYPE_EVM)
184+ else false)
185+ then throw(err_)
186+ else true
187+
188+
176189 func _publicKeysToAddrsStr (publicKeys_) = {
177190 func foldfunc (acc_,elem_) = (acc_ :+ toString(addressFromPublicKey(fromBase58String(elem_))))
178191
179192 let $l = publicKeys_
180193 let $s = size($l)
181194 let $acc0 = nil
182195 func $f0_1 ($a,$i) = if (($i >= $s))
183196 then $a
184197 else foldfunc($a, $l[$i])
185198
186199 func $f0_2 ($a,$i) = if (($i >= $s))
187200 then $a
188201 else throw("List size exceeds 51")
189202
190203 $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($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), 51)
191204 }
192205
193206
194207 func _loadInit () = match getBoolean(KEY_INIT) {
195208 case a: Boolean =>
196209 a
197210 case _ =>
198211 false
199212 }
200213
201214
202215 func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
203216
204217
205218 func _loadMultisig () = match getString(KEY_MULTISIG) {
206219 case a: String =>
207220 addressFromStringValue(a)
208221 case _ =>
209222 Address(base58'')
210223 }
211224
212225
213226 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
214227
215228
216229 func _loadProxySecDepo (account_) = match getInteger(makeString([KEY_PROXY_SEC_DEPO, toString(account_)], SEPARATOR)) {
217230 case a: Int =>
218231 a
219232 case _ =>
220233 0
221234 }
222235
223236
224237 func _saveProxySecDepo (account_,val_) = [IntegerEntry(makeString([KEY_PROXY_SEC_DEPO, toString(account_)], SEPARATOR), val_)]
225238
226239
227240 func _loadProxySecDepoPerEvent () = match getInteger(KEY_PROXY_SEC_DEPO_PER_EVENT) {
228241 case a: Int =>
229242 a
230243 case _ =>
231244 0
232245 }
233246
234247
235248 func _saveProxySecDepoPerEvent (val_) = [IntegerEntry(KEY_PROXY_SEC_DEPO_PER_EVENT, val_)]
236249
237250
238251 func _loadWavesEventSize () = match getInteger(KEY_WAVES_EVENT_SIZE) {
239252 case a: Int =>
240253 a
241254 case _ =>
242255 0
243256 }
244257
245258
246259 func _saveWavesEventSize (val_) = [IntegerEntry(KEY_WAVES_EVENT_SIZE, val_)]
247260
248261
249262 func _loadEVMEventSize () = match getInteger(KEY_EVM_EVENT_SIZE) {
250263 case a: Int =>
251264 a
252265 case _ =>
253266 0
254267 }
255268
256269
257270 func _saveEVMEventSize (val_) = [IntegerEntry(KEY_EVM_EVENT_SIZE, val_)]
258271
259272
260273 func _loadWavesEvent (index_) = match getString(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR)) {
261274 case a: String =>
262275 let struct = split(a, SEPARATOR)
263276 $Tuple13(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], split(struct[5], ARGS_SEPARATOR), struct[6], parseIntValue(struct[7]), struct[8], parseIntValue(struct[9]), parseIntValue(struct[10]), parseIntValue(struct[11]), addressFromStringValue(struct[12]))
264277 case _ =>
265278 $Tuple13(0, 0, 0, "", "", nil, "", 0, "", 0, 0, 0, Address(base58''))
266279 }
267280
268281
269282 func _saveWavesEvent (index_,event_) = [StringEntry(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, makeString(event_._6, ARGS_SEPARATOR), event_._7, toString(event_._8), event_._9, toString(event_._10), toString(event_._11), toString(event_._12), toString(event_._13)], SEPARATOR))]
270283
271284
272285 func _loadEVMEvent (index_) = match getString(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR)) {
273286 case a: String =>
274287 let struct = split(a, SEPARATOR)
275288 $Tuple12(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], struct[5], parseIntValue(struct[6]), struct[7], parseIntValue(struct[8]), parseIntValue(struct[9]), parseIntValue(struct[10]), addressFromStringValue(struct[11]))
276289 case _ =>
277290 $Tuple12(0, 0, 0, "", "", "", 0, "", 0, 0, 0, Address(base58''))
278291 }
279292
280293
281294 func _saveEVMEvent (index_,event_) = [StringEntry(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, event_._6, toString(event_._7), event_._8, toString(event_._9), toString(event_._10), toString(event_._11), toString(event_._12)], SEPARATOR))]
295+
296+
297+func _loadEventType (execChainId_) = match getString(makeString([KEY_EVENT_TYPE, toString(execChainId_)], SEPARATOR)) {
298+ case a: String =>
299+ a
300+ case _ =>
301+ ""
302+}
303+
304+
305+func _saveEventType (execChainId_,val_) = [StringEntry(makeString([KEY_EVENT_TYPE, toString(execChainId_)], SEPARATOR), val_)]
282306
283307
284308 func _loadWavesEventStatus (eventHash_) = match getInteger(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR)) {
285309 case a: Int =>
286310 a
287311 case _ =>
288312 0
289313 }
290314
291315
292316 func _saveWavesEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
293317
294318
295319 func _loadEVMEventStatus (eventHash_) = match getInteger(makeString([KEY_EVM_EVENT_STATUS, eventHash_], SEPARATOR)) {
296320 case a: Int =>
297321 a
298322 case _ =>
299323 0
300324 }
301325
302326
303327 func _saveEVMEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_EVM_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
304328
305329
306330 func _loadPublishedWavesEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
307331 case a: Int =>
308332 a
309333 case _ =>
310334 0
311335 }
312336
313337
314338 func _savePublishedWavesEventByWitness (publicKey_,eventId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR), val_)]
315339
316340
317341 func _loadPublishedEVMEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_EVM_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
318342 case a: Int =>
319343 a
320344 case _ =>
321345 0
322346 }
323347
324348
325349 func _savePublishedEVMEventByWitness (publicKey_,eventId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR), val_)]
326350
327351
328352 func _loadCurrentEpoch (callerChainId_) = match getInteger(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR)) {
329353 case a: Int =>
330354 a
331355 case _ =>
332356 0
333357 }
334358
335359
336360 func _saveCurrentEpoch (callerChainId_,val_) = [IntegerEntry(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR), val_)]
337361
338362
339363 func _loadWavesEventCallerIdxSize (callerChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR)) {
340364 case a: Int =>
341365 a
342366 case _ =>
343367 0
344368 }
345369
346370
347371 func _saveWavesEventCallerIdxSize (callerChainId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR), val_)]
348372
349373
350374 func _loadWavesEventCallerIdx (callerChainId_,idx_) = match getInteger(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR)) {
351375 case a: Int =>
352376 a
353377 case _ =>
354378 0
355379 }
356380
357381
358382 func _saveWavesEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
359383
360384
361385 func _loadEVMEventCallerIdxSize (callerChainId_) = match getInteger(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR)) {
362386 case a: Int =>
363387 a
364388 case _ =>
365389 0
366390 }
367391
368392
369393 func _saveEVMEventCallerIdxSize (callerChainId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR), val_)]
370394
371395
372396 func _loadEVMEventCallerIdx (callerChainId_,idx_) = match getInteger(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR)) {
373397 case a: Int =>
374398 a
375399 case _ =>
376400 0
377401 }
378402
379403
380404 func _saveEVMEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
381405
382406
383407 func _loadWavesEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
384408 case a: Int =>
385409 a
386410 case _ =>
387411 0
388412 }
389413
390414
391415 func _saveWavesEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
392416
393417
394418 func _loadWavesEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
395419 case a: Int =>
396420 a
397421 case _ =>
398422 0
399423 }
400424
401425
402426 func _saveWavesEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
403427
404428
405429 func _loadEVMEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
406430 case a: Int =>
407431 a
408432 case _ =>
409433 0
410434 }
411435
412436
413437 func _saveEVMEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
414438
415439
416440 func _loadEVMEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
417441 case a: Int =>
418442 a
419443 case _ =>
420444 0
421445 }
422446
423447
424448 func _saveEVMEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
425449
426450
427451 func _loadWitnesses (callerChainId_,epoch_) = match getString(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR)) {
428452 case a: String =>
429453 if ((size(a) > 0))
430454 then split(a, SEPARATOR)
431455 else nil
432456 case _ =>
433457 nil
434458 }
435459
436460
437461 func _saveWitnesses (callerChainId_,epoch_,witnesses_) = [StringEntry(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR), makeString(witnesses_, SEPARATOR))]
438462
439463
440464 func _loadRewardTokenAddress () = match getString(KEY_REWARD_TOKEN_ADDRESS) {
441465 case a: String =>
442466 addressFromStringValue(a)
443467 case _ =>
444468 Address(base58'')
445469 }
446470
447471
448472 func _saveRewardTokenAddress (val_) = [StringEntry(KEY_REWARD_TOKEN_ADDRESS, toString(val_))]
449473
450474
451475 func _loadRewardAmount () = match getInteger(KEY_REWARD_AMOUNT) {
452476 case a: Int =>
453477 a
454478 case _ =>
455479 0
456480 }
457481
458482
459483 func _saveRewardAmount (val_) = [IntegerEntry(KEY_REWARD_AMOUNT, val_)]
460484
461485
462486 func _onlyThisContract (caller_) = if ((caller_ != this))
463487 then throw("_onlyThisContract: revert")
464488 else true
465489
466490
467491 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
468492 then throw("_whenMultisigSet: revert")
469493 else true
470494
471495
472496 func _whenNotInitialized () = if (_loadInit())
473497 then throw("_whenNotInitialized: revert")
474498 else true
475499
476500
477501 func _whenInitialized () = if (!(_loadInit()))
478502 then throw("_whenInitialized: revert")
479503 else true
480504
481505
482506 func _isActiveWitness (publicKey_,publicKeys_,err_) = if (!(containsElement(publicKeys_, publicKey_)))
483507 then throw(err_)
484508 else true
485509
486510
487511 func _notConfirmedWavesEvent (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) > EVENT_STATUS_PROCESSING))
488512 then throw(err_)
489513 else true
490514
491515
492516 func _notConfirmedEVMEvent (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) > EVENT_STATUS_PROCESSING))
493517 then throw(err_)
494518 else true
495519
496520
497521 func _wavesEventNotExist (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) != 0))
498522 then throw(err_)
499523 else true
500524
501525
502526 func _evmEventNotExist (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) != 0))
503527 then throw(err_)
504528 else true
505529
506530
507531 func _notPublishedWavesEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedWavesEventByWitness(publicKey_, eventId_) != 0))
508532 then throw(err_)
509533 else true
510534
511535
512536 func _notPublishedEVMEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedEVMEventByWitness(publicKey_, eventId_) > 0))
513537 then throw(err_)
514538 else true
515539
516540
517541 func _isQuorumReached (confirmations_,total_,witnessSize_) = if (if ((confirmations_ > (witnessSize_ / 2)))
518542 then true
519543 else ((total_ - confirmations_) > (witnessSize_ / 2)))
520544 then true
521545 else false
522546
523547
524548 func _getEventStatus (confirmations_,total_,witnessSize_) = if ((confirmations_ > (witnessSize_ / 2)))
525549 then EVENT_STATUS_CONFIRMED
526550 else if (((total_ - confirmations_) > (witnessSize_ / 2)))
527551 then EVENT_STATUS_REJECTED
528552 else EVENT_STATUS_PROCESSING
529553
530554
555+func _checkEventType (executionChainId_,type_,err_) = if ((_loadEventType(executionChainId_) != type_))
556+ then throw(err_)
557+ else true
558+
559+
531560 func _calcWavesEventHash (event_) = {
532561 let eventBytes = (((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(makeString(event_._6, ARGS_SEPARATOR))) + toBytes(event_._7)) + toBytes(event_._8))
533562 toBase58String(keccak256_16Kb(eventBytes))
534563 }
535564
536565
537566 func _calcEVMEventHash (event_) = {
538567 let eventBytes = ((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(event_._6)) + toBytes(event_._7))
539568 toBase58String(keccak256_16Kb(eventBytes))
540569 }
541570
542571
543572 func _setWavesEventHash (event_,hash_) = $Tuple13(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, hash_, event_._10, event_._11, event_._12, event_._13)
544573
545574
546575 func _setEVMEventHash (event_,hash_) = $Tuple12(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, hash_, event_._9, event_._10, event_._11, event_._12)
547576
548577
549578 func _setWavesEventConfirmations (event_,confirmations_,total_) = $Tuple13(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, confirmations_, total_, event_._12, event_._13)
550579
551580
552581 func _setEVMEventConfirmations (event_,confirmations_,total_) = $Tuple12(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, confirmations_, total_, event_._11, event_._12)
553582
554583
555584 @Callable(i)
556585 func init (proxySecDepoPerEvent_,rewardTokenAddress_,rewardAmount_) = {
557586 let err = if (if (if (if (if (_onlyThisContract(i.caller))
558587 then _whenNotInitialized()
559588 else false)
560589 then _whenMultisigSet()
561590 else false)
562591 then _validateInt(proxySecDepoPerEvent_, 0, MAX_INT, "init: invalid proxySecDepoPerEvent")
563592 else false)
564593 then _validateAddress(rewardTokenAddress_, "init: invalid rewardTokenAddress")
565594 else false)
566595 then _validateInt(rewardAmount_, 0, MAX_INT, "init: invalid rewardAmount")
567596 else false
568597 if ((err == err))
569598 then $Tuple2((((_saveInit(true) ++ _saveProxySecDepoPerEvent(proxySecDepoPerEvent_)) ++ _saveRewardTokenAddress(addressFromStringValue(rewardTokenAddress_))) ++ _saveRewardAmount(rewardAmount_)), unit)
570599 else throw("Strict value is not equal to itself.")
571600 }
572601
573602
574603
575604 @Callable(i)
576605 func setActiveWitnesses (callerChainId_,witnesses_) = {
577606 let err = if (if (_onlyThisContract(i.caller))
578607 then _whenInitialized()
579608 else false)
580609 then _validatePublicKeys(witnesses_, "setActiveWitnesses: invalid witnesses")
581610 else false
582611 if ((err == err))
583612 then {
584613 let epoch = _loadCurrentEpoch(callerChainId_)
585614 $Tuple2((_saveCurrentEpoch(callerChainId_, (epoch + 1)) ++ _saveWitnesses(callerChainId_, (epoch + 1), witnesses_)), unit)
586615 }
587616 else throw("Strict value is not equal to itself.")
588617 }
589618
590619
591620
592621 @Callable(i)
593622 func submitWavesCallEvent (callerChainId_,executionChainId_,nonce_,executionContract_,functionName_,args_,txHash_,blockNumber_) = {
594- let err = if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid callerChainId"))
623+ let err = if (if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid callerChainId"))
595624 then _validateInt(executionChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid executionChainId")
596625 else false)
597626 then _validateInt(nonce_, 0, MAX_INT, "submitWavesCallEvent: invalid nonce")
598627 else false)
599628 then _validateString(executionContract_, "submitWavesCallEvent: invalid executionContract")
600629 else false)
601630 then _validateString(functionName_, "submitWavesCallEvent: invalid functionName")
602631 else false)
603632 then _validateArgs(args_, "submitWavesCallEvent: invalid args")
604633 else false)
605634 then _validateString(txHash_, "submitWavesCallEvent: invalid txHash")
606635 else false)
607636 then _validateInt(blockNumber_, 0, MAX_INT, "submitWavesCallEvent: invalid blockNumber")
637+ else false)
638+ then _checkEventType(executionChainId_, EVENT_TYPE_WAVES, "submitWavesCallEvent: invalid type")
608639 else false
609640 if ((err == err))
610641 then {
611642 let proxySecDepo = _loadProxySecDepo(i.caller)
612643 let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
613644 let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
614645 let event = $Tuple13(callerChainId_, executionChainId_, nonce_, executionContract_, functionName_, args_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
615646 let eventSize = _loadWavesEventSize()
616647 let eventHash = _calcWavesEventHash(event)
617648 let eventUpdated = _setWavesEventHash(event, eventHash)
618649 let err1 = if (_wavesEventNotExist(eventHash, "submitWavesCallEvent: already exists"))
619650 then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitWavesCallEvent: no security deposit")
620651 else false
621652 if ((err1 == err1))
622653 then {
623654 let callerIdxSize = _loadWavesEventCallerIdxSize(callerChainId_)
624655 $Tuple2((((((_saveProxySecDepo(i.caller, proxySecDepoUpdated) ++ _saveWavesEvent(eventSize, eventUpdated)) ++ _saveWavesEventStatus(eventHash, EVENT_STATUS_PROCESSING)) ++ _saveWavesEventSize((eventSize + 1))) ++ _saveWavesEventCallerIdx(callerChainId_, callerIdxSize, eventSize)) ++ _saveWavesEventCallerIdxSize(callerChainId_, (callerIdxSize + 1))), unit)
625656 }
626657 else throw("Strict value is not equal to itself.")
627658 }
628659 else throw("Strict value is not equal to itself.")
629660 }
630661
631662
632663
633664 @Callable(i)
634665 func submitEVMCallEvent (callerChainId_,executionChainId_,nonce_,executionContract_,calldata_,txHash_,blockNumber_) = {
635- let err = if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid callerChainId"))
666+ let err = if (if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid callerChainId"))
636667 then _validateInt(executionChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid executionChainId")
637668 else false)
638669 then _validateInt(nonce_, 0, MAX_INT, "submitEVMCallEvent: invalid nonce")
639670 else false)
640671 then _validateString(executionContract_, "submitEVMCallEvent: invalid executionContract")
641672 else false)
642673 then _validateString(calldata_, "submitEVMCallEvent: invalid calldata")
643674 else false)
644675 then _validateString(txHash_, "submitEVMCallEvent: invalid txHash")
645676 else false)
646677 then _validateInt(blockNumber_, 0, MAX_INT, "submitEVMCallEvent: invalid blockNumber")
678+ else false)
679+ then _checkEventType(executionChainId_, EVENT_TYPE_EVM, "submitEVMCallEvent: invalid type")
647680 else false
648681 if ((err == err))
649682 then {
650683 let proxySecDepo = _loadProxySecDepo(i.caller)
651684 let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
652685 let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
653686 let event = $Tuple12(callerChainId_, executionChainId_, nonce_, executionContract_, calldata_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
654687 let eventSize = _loadEVMEventSize()
655688 let eventHash = _calcEVMEventHash(event)
656689 let eventUpdated = _setEVMEventHash(event, eventHash)
657690 let err1 = if (_evmEventNotExist(eventHash, "submitEVMCallEvent: already exists"))
658691 then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitEVMCallEvent: no security deposit")
659692 else false
660693 if ((err1 == err1))
661694 then {
662695 let callerIdxSize = _loadEVMEventCallerIdxSize(callerChainId_)
663696 $Tuple2((((((_saveProxySecDepo(i.caller, proxySecDepoUpdated) ++ _saveEVMEvent(eventSize, eventUpdated)) ++ _saveEVMEventStatus(eventHash, EVENT_STATUS_PROCESSING)) ++ _saveEVMEventSize((eventSize + 1))) ++ _saveEVMEventCallerIdx(callerChainId_, callerIdxSize, eventSize)) ++ _saveEVMEventCallerIdxSize(callerChainId_, (callerIdxSize + 1))), unit)
664697 }
665698 else throw("Strict value is not equal to itself.")
666699 }
667700 else throw("Strict value is not equal to itself.")
668701 }
669702
670703
671704
672705 @Callable(i)
673706 func publishWavesEventStatus (eventIdx_,status_) = {
674707 let eventSize = _loadWavesEventSize()
675708 let callerPublicKey = toBase58String(i.callerPublicKey)
676709 let err = if (_validateEventIdx(eventIdx_, eventSize, "publishWavesEventStatus: invalid event idx"))
677710 then _validateEventStatus(status_, "publishWavesEventStatus: invalid status")
678711 else false
679712 if ((err == err))
680713 then {
681714 let event = _loadWavesEvent(eventIdx_)
682715 let callerChainId = event._1
683716 let executionChainId = event._2
684717 let eventHash = event._9
685718 let eventConfirmations = event._10
686719 let eventTotal = event._11
687720 let proxySecDepo = event._12
688721 let proxy = event._13
689722 let epoch = _loadCurrentEpoch(callerChainId)
690723 let activeWitnesses = _loadWitnesses(callerChainId, epoch)
691724 let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishWavesEventStatus: invalid caller"))
692725 then _notConfirmedWavesEvent(eventHash, "publishWavesEventStatus: event already confirmed")
693726 else false)
694727 then _notPublishedWavesEventByWitness(callerPublicKey, eventIdx_, "publishWavesEventStatus: already published")
695728 else false
696729 if ((err1 == err1))
697730 then {
698731 let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
699732 then _setWavesEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
700733 else if ((status_ == EVENT_STATUS_REJECTED))
701734 then _setWavesEventConfirmations(event, eventConfirmations, (eventTotal + 1))
702735 else throw("publishWavesEventStatus: incorrect status")
703736 let executorIdxSize = _loadWavesEventExecutorIdxSize(executionChainId)
704737 let finalization = if (_isQuorumReached(eventUpdated._10, eventUpdated._11, size(activeWitnesses)))
705738 then {
706739 let status = _getEventStatus(eventUpdated._10, eventUpdated._11, size(activeWitnesses))
707- let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
708- then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
709- else if ((status == EVENT_STATUS_REJECTED))
710- then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
711- else nil
712740 let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
713741 let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
714742 if ((witnessesRewards == witnessesRewards))
715- then (((proxySecDepoUpdated ++ _saveWavesEventStatus(eventHash, status)) ++ _saveWavesEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveWavesEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
743+ then if ((status == EVENT_STATUS_CONFIRMED))
744+ then (((_saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo)) ++ _saveWavesEventStatus(eventHash, status)) ++ _saveWavesEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveWavesEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
745+ else if ((status == EVENT_STATUS_REJECTED))
746+ then (_saveWavesEventStatus(eventHash, status) ++ [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)])
747+ else nil
716748 else throw("Strict value is not equal to itself.")
717749 }
718750 else nil
719751 $Tuple2(((_saveWavesEvent(eventIdx_, eventUpdated) ++ _savePublishedWavesEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
720752 }
721753 else throw("Strict value is not equal to itself.")
722754 }
723755 else throw("Strict value is not equal to itself.")
724756 }
725757
726758
727759
728760 @Callable(i)
729761 func publishEVMEventStatus (eventIdx_,status_) = {
730762 let eventSize = _loadEVMEventSize()
731763 let callerPublicKey = toBase58String(i.callerPublicKey)
732764 let err = if (_validateEventIdx(eventIdx_, eventSize, "publishEVMEventStatus: invalid event idx"))
733765 then _validateEventStatus(status_, "publishEVMEventStatus: invalid status")
734766 else false
735767 if ((err == err))
736768 then {
737769 let event = _loadEVMEvent(eventIdx_)
738770 let callerChainId = event._1
739771 let executionChainId = event._2
740772 let eventHash = event._8
741773 let eventConfirmations = event._9
742774 let eventTotal = event._10
743775 let proxySecDepo = event._11
744776 let proxy = event._12
745777 let epoch = _loadCurrentEpoch(callerChainId)
746778 let activeWitnesses = _loadWitnesses(callerChainId, epoch)
747779 let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishEVMEventStatus: invalid caller"))
748780 then _notConfirmedEVMEvent(eventHash, "publishEVMEventStatus: event already confirmed")
749781 else false)
750782 then _notPublishedEVMEventByWitness(callerPublicKey, eventIdx_, "publishEVMEventStatus: already published")
751783 else false
752784 if ((err1 == err1))
753785 then {
754786 let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
755787 then _setEVMEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
756788 else if ((status_ == EVENT_STATUS_REJECTED))
757789 then _setEVMEventConfirmations(event, eventConfirmations, (eventTotal + 1))
758790 else throw("publishEVMEventStatus: incorrect status")
759791 let executorIdxSize = _loadEVMEventExecutorIdxSize(executionChainId)
760792 let finalization = if (_isQuorumReached(eventUpdated._9, eventUpdated._10, size(activeWitnesses)))
761793 then {
762794 let status = _getEventStatus(eventUpdated._9, eventUpdated._10, size(activeWitnesses))
763- let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
764- then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
765- else if ((status == EVENT_STATUS_REJECTED))
766- then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
767- else nil
768795 let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
769796 let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
770797 if ((witnessesRewards == witnessesRewards))
771- then (((proxySecDepoUpdated ++ _saveEVMEventStatus(eventHash, status)) ++ _saveEVMEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveEVMEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
798+ then if ((status == EVENT_STATUS_CONFIRMED))
799+ then (((_saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo)) ++ _saveEVMEventStatus(eventHash, status)) ++ _saveEVMEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveEVMEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
800+ else if ((status == EVENT_STATUS_REJECTED))
801+ then (_saveEVMEventStatus(eventHash, status) ++ [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)])
802+ else nil
772803 else throw("Strict value is not equal to itself.")
773804 }
774805 else nil
775806 $Tuple2(((_saveEVMEvent(eventIdx_, eventUpdated) ++ _savePublishedEVMEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
776807 }
777808 else throw("Strict value is not equal to itself.")
778809 }
779810 else throw("Strict value is not equal to itself.")
780811 }
781812
782813
783814
784815 @Callable(i)
785816 func addProxySecurityDeposit (recipient_) = {
786817 let recipient = if ((recipient_ == ""))
787818 then toString(i.caller)
788819 else recipient_
789820 let err = if (if (_validateAddress(recipient, "addProxySecurityDeposit: invalid recipient"))
790821 then _validatePaymentsSize(i.payments, 1, "addProxySecurityDeposit: no payment")
791822 else false)
792823 then _validatePaymentAsset(i.payments[0], unit, "addProxySecurityDeposit: invalid asset")
793824 else false
794825 if ((err == err))
795826 then {
796827 let recipientAddr = addressFromStringValue(recipient)
797828 let balance = _loadProxySecDepo(recipientAddr)
798829 let updatedBalance = (balance + i.payments[0].amount)
799830 $Tuple2(_saveProxySecDepo(recipientAddr, updatedBalance), unit)
800831 }
801832 else throw("Strict value is not equal to itself.")
802833 }
803834
804835
805836
806837 @Callable(i)
807838 func subProxySecurityDeposit (amount_) = {
808839 let balance = _loadProxySecDepo(i.caller)
809840 if ((amount_ > balance))
810841 then throw("subProxySecurityDeposit: insufficient balance")
811842 else $Tuple2((_saveProxySecDepo(i.caller, (balance - amount_)) ++ [ScriptTransfer(i.caller, amount_, unit)]), unit)
812843 }
813844
814845
815846
816847 @Callable(i)
848+func setEventType (execChainId_,type_) = {
849+ let err = if (if (if (_onlyThisContract(i.caller))
850+ then _whenInitialized()
851+ else false)
852+ then _validateInt(execChainId_, 0, MAX_INT, "setEventType: invalid execChainId")
853+ else false)
854+ then _validateEventType(type_, "setEventType: invalid event type")
855+ else false
856+ if ((err == err))
857+ then $Tuple2(_saveEventType(execChainId_, type_), unit)
858+ else throw("Strict value is not equal to itself.")
859+ }
860+
861+
862+
863+@Callable(i)
864+func isConfirmedEvent (eventId_,execChainId_) = {
865+ let type = _loadEventType(execChainId_)
866+ let status = if ((type == EVENT_TYPE_WAVES))
867+ then {
868+ let event = _loadWavesEvent(eventId_)
869+ _loadWavesEventStatus(event._9)
870+ }
871+ else if ((type == EVENT_TYPE_EVM))
872+ then {
873+ let event = _loadEVMEvent(eventId_)
874+ _loadEVMEventStatus(event._8)
875+ }
876+ else 0
877+ let err = _validateEventStatus(status, "isConfirmedEvent: no such event")
878+ if ((err == err))
879+ then if ((status == EVENT_STATUS_CONFIRMED))
880+ then $Tuple2(nil, true)
881+ else $Tuple2(nil, false)
882+ else throw("Strict value is not equal to itself.")
883+ }
884+
885+
886+
887+@Callable(i)
817888 func setMultisig (multisig_) = {
818889 let err = if (_onlyThisContract(i.caller))
819890 then _validateAddress(multisig_, "setMultisig: invalid multisig address")
820891 else false
821892 if ((err == err))
822893 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
823894 else throw("Strict value is not equal to itself.")
824895 }
825896
826897
827898 @Verifier(tx)
828899 func verify () = match getString(KEY_MULTISIG) {
829900 case multisig: String =>
830901 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
831902 case _ =>
832903 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
833904 }
834905

github/deemru/w8io/873ac7e 
150.50 ms