tx · HPfTN48VLacKvTn1qDsXXyQBYpPfu5xmYJgkWXMMnEni

3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy:  -0.03200000 Waves

2023.07.24 19:55 [2680209] smart account 3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy > SELF 0.00000000 Waves

{ "type": 13, "id": "HPfTN48VLacKvTn1qDsXXyQBYpPfu5xmYJgkWXMMnEni", "fee": 3200000, "feeAssetId": null, "timestamp": 1690217761534, "version": 2, "chainId": 84, "sender": "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy", "senderPublicKey": "C3PaRKeL8AUKbwUqdniMQtThgcTh5DYHV1777Hkxy7rp", "proofs": [ "5ur5WQtSyb8Xds3UFxVFtRvR6YSMYVysey9CBeZ9oKyZhbXrbTxnPceKhzoshvkeK9PKqV3J91XyEvWj13bTHGVz" ], "script": "base64:BgJKCAISAwoBGBIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBGBIDCgEIEgMKARgSAwoBGBIDCgEYEgMKARgSAwoBCBIAEgMKAQieAQACTTYAwIQ9AAJNOACAwtcvAAhNSUxMSU9ONgCAgOmDsd4WAA5NQVJLRVRJTkdTSEFSRQCgjQYACVRFQU1TSEFSRQDAmgwADUFDVElWSVRZU0hBUkUAoI0GAAtQTEFZRVJTSEFSRQCAtRgACllFQVJNSUxMSVMAgIbrx3UAA0RBWQCAuJkpABBtYXJrZXRpbmdBZGRyS2V5Ag1tYXJrZXRpbmdBZGRyAAt0ZWFtQWRkcktleQIIdGVhbUFkZHIAFGxhc3RNYXJrZXRpbmdUaW1lS2V5AhlsYXN0Q2xhaW1lZFRpbWVfbWFya2V0aW5nABZtYXJrZXRpbmdBbW91bnRMZWZ0S2V5AhNtYXJrZXRpbmdBbW91bnRMZWZ0AA9sYXN0VGVhbVRpbWVLZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtABF0ZWFtQW1vdW50TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFWxhc3RBY3Rpdml0aWVzVGltZUtleQIabGFzdENsYWltZWRUaW1lX2FjdGl2aXRpZXMAEGFjdEFtb3VudExlZnRLZXkCFGFjdGl2aXRpZXNBbW91bnRMZWZ0ABRzdGFrZXJzQW1vdW50TGVmdEtleQIRc3Rha2Vyc0Ftb3VudExlZnQBGGtleUxhc3RDbGFpbWVkVGltZUJ5VXNlcgEEYWRkcgkArAICAhRsYXN0Q2xhaW1lZFRpbWVVc2VyXwUEYWRkcgEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBBnBlcmlvZAkAawMFCE1JTExJT042CQBoAgULUExBWUVSU0hBUkUJAGQCBQZwZXJpb2QAAQkAaAIABgUCTTYAD3dsZ0lzc3VlVGltZUtleQINd2xnX2lzc3VlVGltZQASd2xnSXNzdWVkQW1vdW50S2V5AhB3bGdfaXNzdWVkQW1vdW50ABF6Yklzc3VlZEFtb3VudEtleQISemJpbGxfaXNzdWVkQW1vdW50AAxpZHhXbGdBbW91bnQAAAALaWR4V2xnUHJpY2UAAQALaWR4V2xnRnVuZHMAAgANaWR4V2xnRWNvbm9teQADAA5pZHhXbGdBY3Rpdml0eQAEAA9pZHhXbGdBcmJpdHJhZ2UABQAKaWR4V2xnUG9vbAAGAA9pZHhXbGdJc3N1ZVRpbWUABwARaWR4V2xnTGFzdE1UQVRpbWUACAAUaWR4V2xnTWFya2V0aW5nVG90YWwACQAVaWR4V2xnTWFya2V0aW5nQW1MZWZ0AAoAGWlkeFdsZ01hcmtldGluZ0FtQXZhaWxOb3cACwAVaWR4V2xnTWFya2V0aW5nV2xnb2xkAAwAD2lkeFdsZ1RlYW1Ub3RhbAANABBpZHhXbGdUZWFtQW1MZWZ0AA4AFGlkeFdsZ1RlYW1BbUF2YWlsTm93AA8AEGlkeFdsZ1RlYW1XbGdvbGQAEAAOaWR4V2xnQWN0VG90YWwAEQAPaWR4V2xnQWN0QW1MZWZ0ABIAE2lkeFdsZ0FjdEFtQXZhaWxOb3cAEwAPaWR4V2xnQWN0V2xnb2xkABQAD2lkeFdsZ0N1clBlcmlvZAAVABFpZHhXbGdBbUxlZnRUb3RhbAAWABtpZHhXbGdDdXJQZXJpb2REaXN0cmlidXRpb24AFwASaWR4V2xnTGFzdFVzZXJUaW1lABgAFGlkeFdsZ1VzZXJBbUF2YWlsTm93ABkAFmlkeFdsZ1NMYW5kRGFpbHlBbW91bnQAGgAWaWR4V2xnSW52ZXN0RnVuZEFtb3VudAAbAAhkYXBwUmVzdAAAAAtkYXBwU3Rha2luZwABAAtkYXBwRWNvbm9teQACAAdkYXBwV2xnAAQACmRhcHBQdXp6bGUABQAOZGFwcEludmVzdEZ1bmQABgEJZ2V0UGllY2VzAhJ1c2VyQWRkclN0ck9yRW1wdHkPc3Rha2luZ0NvbnRyYWN0BAVwcm9wcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAITcmVzVHlwZXNQcm9wb3J0aW9ucwILMF8wXzBfMF8wXzACAV8KAQVhZGRlcgIDYWNjBGl0ZW0JAGQCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQQKdG90YWxQb3dlcgoAAiRsBQVwcm9wcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYECnVzZXJzUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQCsAgICFHN0YWtlZFBpZWNlc0J5T3duZXJfBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAkAzAgCBQp0b3RhbFBvd2VyCQDMCAIFCnVzZXJzUG93ZXIFA25pbAELZ2V0V2xnU3RhdHMEC3VzZXJBZGRyT3B0CWNvbnRyYWN0cwZ1c2R0SWQVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUSd2xnSXNzdWVkQW1vdW50S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQECmVjb25vbXlVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFC2RhcHBFY29ub215BQZ1c2R0SWQEB3Jlc3RVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHBSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFBnVzZHRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAlwdXp6bGVVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCmRhcHBQdXp6bGUFBnVzZHRJZAQSaW52ZXN0RnVuZENvbnRyYWN0CQCRAwIFCWNvbnRyYWN0cwUOZGFwcEludmVzdEZ1bmQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQZ1c2R0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSaW52ZXN0RnVuZENvbnRyYWN0BRF6Yklzc3VlZEFtb3VudEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCmVjb25vbXlVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBAV3bGdJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFD3dsZ0lzc3VlVGltZUtleQIPTm90IGluaXRpYWxpemVkBA5tYXJrZXRpbmdUb3RhbAkAawMFCE1JTExJT042BQ5NQVJLRVRJTkdTSEFSRQUCTTYEE21hcmtldGluZ0Ftb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFFm1hcmtldGluZ0Ftb3VudExlZnRLZXkFDm1hcmtldGluZ1RvdGFsBBFsYXN0TWFya2V0aW5nVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUUbGFzdE1hcmtldGluZ1RpbWVLZXkFCWlzc3VlVGltZQQNbWFya2V0aW5nQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAnQgCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUQbWFya2V0aW5nQWRkcktleQQbbWFya2V0aW5nQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFDm1hcmtldGluZ1RvdGFsCQBlAgUDbm93BRFsYXN0TWFya2V0aW5nVGltZQUKWUVBUk1JTExJUwkAzAgCBRNtYXJrZXRpbmdBbW91bnRMZWZ0BQNuaWwED21hcmtldGluZ1dsZ29sZAkA8AcCBQ1tYXJrZXRpbmdBZGRyBQV3bGdJZAQJdGVhbVRvdGFsCQBrAwUITUlMTElPTjYFCVRFQU1TSEFSRQUCTTYEDnRlYW1BbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRF0ZWFtQW1vdW50TGVmdEtleQUJdGVhbVRvdGFsBAxsYXN0VGVhbVRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFD2xhc3RUZWFtVGltZUtleQUJaXNzdWVUaW1lBAh0ZWFtQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAnQgCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwULdGVhbUFkZHJLZXkEFnRlYW1BbW91bnRBdmFpbGFibGVOb3cJAJcDAQkAzAgCCQBrAwUJdGVhbVRvdGFsCQBlAgUDbm93BQxsYXN0VGVhbVRpbWUJAGgCAAMFCllFQVJNSUxMSVMJAMwIAgUOdGVhbUFtb3VudExlZnQFA25pbAQKdGVhbVdsZ29sZAkA8AcCBQh0ZWFtQWRkcgUFd2xnSWQECGFjdFRvdGFsCQBrAwUITUlMTElPTjYFDUFDVElWSVRZU0hBUkUFAk02BA1hY3RBbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRBhY3RBbW91bnRMZWZ0S2V5BQhhY3RUb3RhbAQSbGFzdEFjdGl2aXRpZXNUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRVsYXN0QWN0aXZpdGllc1RpbWVLZXkFCWlzc3VlVGltZQQVYWN0QW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCGFjdFRvdGFsCQBlAgUDbm93BRJsYXN0QWN0aXZpdGllc1RpbWUJAGgCAAMFCllFQVJNSUxMSVMJAMwIAgUNYWN0QW1vdW50TGVmdAUDbmlsBAlhY3RXbGdvbGQJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHBSZXN0BQV3bGdJZAQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnCQEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQULdXNlckFkZHJPcHQFCWlzc3VlVGltZQQObGFzdFVzZXJQZXJpb2QJAGkCCQBlAgUMbGFzdFVzZXJUaW1lBQlpc3N1ZVRpbWUFCllFQVJNSUxMSVMECm5vd0xpbWl0ZWQJAJcDAQkAzAgCBQNub3cJAMwIAgkAZAIFCWlzc3VlVGltZQkAaAIAAwUKWUVBUk1JTExJUwUDbmlsBAljdXJQZXJpb2QJAJcDAQkAzAgCCQBpAgkAZQIFA25vdwUJaXNzdWVUaW1lBQpZRUFSTUlMTElTCQDMCAIAAgUDbmlsBANlZmYJAQlnZXRQaWVjZXMCBQt1c2VyQWRkck9wdAkAkQMCBQljb250cmFjdHMFC2RhcHBTdGFraW5nBBVjdXJQZXJpb2REaXN0cmlidXRpb24JARRkaXN0cmlidXRpb25CeVBlcmlvZAEFCWN1clBlcmlvZAQKdXNlckFtb3VudAkAawMDCQAAAgUObGFzdFVzZXJQZXJpb2QFCWN1clBlcmlvZAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQFDGxhc3RVc2VyVGltZQUKWUVBUk1JTExJUwMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABCQBkAgkAawMJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFDGxhc3RVc2VyVGltZQUKWUVBUk1JTExJUwkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFCllFQVJNSUxMSVMJAGQCCQBkAgkAawMJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEFDGxhc3RVc2VyVGltZQUKWUVBUk1JTExJUwkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMFCWN1clBlcmlvZAUKWUVBUk1JTExJUwkAkQMCBQNlZmYAAQkAkQMCBQNlZmYAAAQQc0xhbmREYWlseUFtb3VudAkAawMJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24FA0RBWQUKWUVBUk1JTExJUwAZCQCRAwIFA2VmZgAABA9hbW91bnRMZWZ0VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFFHN0YWtlcnNBbW91bnRMZWZ0S2V5AAAJAMwIAgUMaXNzdWVkQW1vdW50CQDMCAIJAGsDBQ10b3RhbEZ1bmRzVXNkBQJNOAUMaXNzdWVkQW1vdW50CQDMCAIFDXRvdGFsRnVuZHNVc2QJAMwIAgUKZWNvbm9teVVzZAkAzAgCBQdyZXN0VXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QJAMwIAgUJaXNzdWVUaW1lCQDMCAIFEWxhc3RNYXJrZXRpbmdUaW1lCQDMCAIFDm1hcmtldGluZ1RvdGFsCQDMCAIFE21hcmtldGluZ0Ftb3VudExlZnQJAMwIAgUbbWFya2V0aW5nQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFD21hcmtldGluZ1dsZ29sZAkAzAgCBQl0ZWFtVG90YWwJAMwIAgUOdGVhbUFtb3VudExlZnQJAMwIAgUWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQp0ZWFtV2xnb2xkCQDMCAIFCGFjdFRvdGFsCQDMCAIFDWFjdEFtb3VudExlZnQJAMwIAgUVYWN0QW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCWFjdFdsZ29sZAkAzAgCBQljdXJQZXJpb2QJAMwIAgUPYW1vdW50TGVmdFRvdGFsCQDMCAIFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCBQxsYXN0VXNlclRpbWUJAMwIAgUKdXNlckFtb3VudAkAzAgCBRBzTGFuZERhaWx5QW1vdW50CQDMCAIFD2ludmVzdEZ1bmRUb3RhbAUDbmlsAQ1rZXlEdWNrSGVhbHRoAQtkdWNrQXNzZXRJZAkArAICAgtkdWNrSGVhbHRoXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tDaGFycwELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0NoYXJzXwULZHVja0Fzc2V0SWQBCWtleUR1Y2tYUAELZHVja0Fzc2V0SWQJAKwCAgIHZHVja1hQXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tMZXZlbAELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0xldmVsXwULZHVja0Fzc2V0SWQBEWtleUR1Y2tGcmVlUG9pbnRzAQtkdWNrQXNzZXRJZAkArAICAg9kdWNrRnJlZVBvaW50c18FC2R1Y2tBc3NldElkARBrZXlEdWNrRXF1aXBtZW50AQtkdWNrQXNzZXRJZAkArAICAg5kdWNrRXF1aXBtZW50XwULZHVja0Fzc2V0SWQBCWtleVVzZXJYUAEEYWRkcgkArAICAgd1c2VyWFBfBQRhZGRyAQxrZXlVc2VyTGV2ZWwBBGFkZHIJAKwCAgIKdXNlckxldmVsXwUEYWRkcgERa2V5VXNlckZyZWVQb2ludHMBBGFkZHIJAKwCAgIPdXNlckZyZWVQb2ludHNfBQRhZGRyAQltYXhIZWFsdGgBBWxldmVsCQBkAgBkBQVsZXZlbAAKQVJUUFJFU0FMRQIHUFJFU0FMRQAKQVJUT05CT0FSRAIHT05CT0FSRAAGTlVNUkVTAAYAD0RBSUxZUkVTQllQSUVDRQCA+NIBAAlEQVlNSUxMSVMAgLiZKQAMV0hNVUxUSVBMSUVSAIDIr6AlABBSRVNPVVJDRVBSSUNFTUlOANW1AgANRVNNQVhQQUNLQUdFUwADAAlFU0JVWUNPRUYABAAKRVNTRUxMQ09FRgAKAAlDT0VGRjJNQVQAgK3iBAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAiU4XzhfOF8xN18xN180Ml8xMl8wXzMwXzAsMCwwLDAsMCwwLDBfCQDMCAICJThfOF84XzE3XzE3XzQyXzI0XzBfNjBfMCwwLDUsMiwwLDAsMF8JAMwIAgInOF84XzhfMTdfMTdfNDJfMzZfMF8xMjBfMCwwLDEwLDQsMCwwLDBfCQDMCAICKThfMTlfMTlfOF8yN18xOV8yNl8xXzIwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV81Ml8xXzQwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV83OF8xXzgwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICIjhfOF84XzhfOF82MF8xM18yXzJfMCwwLDAsMCwwLDAsMF8JAMwIAgIiOF84XzhfOF84XzYwXzI2XzJfNF8wLDAsMCwwLDAsMCwwXwkAzAgCAiI4XzhfOF84XzhfNjBfMzlfMl84XzAsMCwwLDAsMCwwLDBfCQDMCAICKTMwXzMwXzNfMTdfMTdfM18zMF8zXzMwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM182MF8zXzUwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM185MF8zXzcwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzExXzRfMzBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMjJfNF81MF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8zM180XzcwXzAsMCwwLDAsMCwwLDBfMjAxBQNuaWwACXJJZHhDb2VmZgAGAA5QUk9EVUNUUEtHU0laRQAKARFrZXlMYXN0VHhJZEJ5VXNlcgEEYWRkcgkArAICAg9sYXN0VHhJZEJ5VXNlcl8FBGFkZHIBFWtleUxhbmRBc3NldElkVG9Pd25lcgEHYXNzZXRJZAkArAICAgluZnRPd25lcl8FB2Fzc2V0SWQBGmtleUxhbmRBc3NldElkVG9DdXN0b21OYW1lAQdhc3NldElkCQCsAgICGGxhbmRDdXN0b21OYW1lQnlBc3NldElkXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgtzdGFrZWRUaW1lXwUHYXNzZXRJZAEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgtpbmZyYUxldmVsXwUHYXNzZXRJZAEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBHR5cGUHYXNzZXRJZAkAuQkCCQDMCAICDWxhbmRBcnRTdGF0dXMJAMwIAgUEdHlwZQkAzAgCBQdhc3NldElkBQNuaWwCAV8BEmtleVdhcmVob3VzZUJ5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIKd2FyZUhvdXNlXwULbGFuZEFzc2V0SWQBGmtleUR1Y2tBc3NldElkVG9DdXN0b21OYW1lAQdhc3NldElkCQCsAgICGGR1Y2tDdXN0b21OYW1lQnlBc3NldElkXwUHYXNzZXRJZAEWa2V5QWRkcmVzc1RvQ3VzdG9tTmFtZQEEYWRkcgkArAICAhhhY2NvdW50Q3VzdG9tTmFtZUJ5QWRkcl8FBGFkZHIBD2tleUFkZHJlc3NSZWZCeQEEYWRkcgkArAICAglhY2NSZWZCeV8FBGFkZHIBHGtleU9uYm9hcmRBcnREdWNrQWN0aXZhdGVkQnkBBGFkZHIJAKwCAgIab25ib2FyZEFydEFjdGl2YXRlZER1Y2tCeV8FBGFkZHIBE2tleUFkZHJlc3NSZWZlcnJhbHMBBGFkZHIJAKwCAgINYWNjUmVmZXJyYWxzXwUEYWRkcgEQa2V5RHVja0lkVG9Pd25lcgEHYXNzZXRJZAkArAICAgpkdWNrT3duZXJfBQdhc3NldElkARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAEOa2V5T3JkZXJCeUxhbmQBC2xhbmRBc3NldElkCQCsAgICCmxhbmRPcmRlcl8FC2xhbmRBc3NldElkAQ5rZXlFc1dhcmVob3VzZQACGmVtZXJnZW5jeVdhcmVob3VzZVByb2R1Y3RzARJnZXRSZWNpcGVNYXRlcmlhbHMBBnJlY2lwZQkAaAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZyZWNpcGUFCXJJZHhDb2VmZgUJQ09FRkYyTUFUAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4AEUluZnJhVXBncmFkZUNvc3RTBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAIDIr6AlAwkAAAIBAVQFByRtYXRjaDAAgMLXLwkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFU1NJWkUAGQAFTVNJWkUAZAAFTFNJWkUA4QEABlhMU0laRQCQAwAHWFhMU0laRQDxBAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEAEUlkeENmZ0Vjb25vbXlEYXBwAAIAFElkeENmZ0dvdmVybmFuY2VEYXBwAAMADUlkeENmZ1dsZ0RhcHAABAAUSWR4Q2ZnUHV6emxlUG9vbERhcHAABQAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABgEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPZWNvbm9teUNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnRWNvbm9teURhcHAAC2dvdkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUUSWR4Q2ZnR292ZXJuYW5jZURhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUNSWR4Q2ZnV2xnRGFwcAAScHV6emxlUG9vbENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUUSWR4Q2ZnUHV6emxlUG9vbERhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwAApyZWNMYW5kTnVtAAAAC3JlY0xhbmRTaXplAAEAC3JlY1RlcnJhaW5zAAIADHJlY0NvbnRpbmVudAADAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhNOb3QgaW5pdGlhbGl6ZWQgeWV0AApJZHhFZmZVc2VyAAEBEWtleVJlc1Byb3BvcnRpb25zAAITcmVzVHlwZXNQcm9wb3J0aW9ucwEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQlvd25lckFkZHIJAKwCAgIUc3Rha2VkUGllY2VzQnlPd25lcl8FCW93bmVyQWRkcgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCWFzQm9vbGVhbgEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFzBQckbWF0Y2gwBQFzCQACAQIZZmFpbCB0byBjYXN0IGludG8gQm9vbGVhbgEPbnVtUGllY2VzQnlTaXplAQhsYW5kU2l6ZQQHJG1hdGNoMAUIbGFuZFNpemUDCQAAAgIBUwUHJG1hdGNoMAUFU1NJWkUDCQAAAgIBTQUHJG1hdGNoMAUFTVNJWkUDCQAAAgIBTAUHJG1hdGNoMAUFTFNJWkUDCQAAAgICWEwFByRtYXRjaDAFBlhMU0laRQMJAAACAgNYWEwFByRtYXRjaDAFB1hYTFNJWkUJAAIBAhFVbmtub3duIGxhbmQgc2l6ZQEOZ2V0Vm90aW5nUG93ZXIBEnVzZXJBZGRyU3RyT3JFbXB0eQQFcHJvcHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARFrZXlSZXNQcm9wb3J0aW9ucwACCzBfMF8wXzBfMF8wAgFfCgEFYWRkZXICA2FjYwRpdGVtCQBkAgUDYWNjCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0ECnRvdGFsUG93ZXIKAAIkbAUFcHJvcHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAp1c2Vyc1Bvd2VyCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFBpZWNlc0J5T3duZXIBBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAkAzAgCBQp0b3RhbFBvd2VyCQDMCAIFCnVzZXJzUG93ZXIFA25pbAANVVNEVFBSSVpFUEFSVACgwh4BEmFzTGlzdEludENvbXBhY3RlZAEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIJTGlzdFtBbnldBAp2YWxBbnlMaXN0BQckbWF0Y2gwAwkBAiE9AgkAkAMBBQp2YWxBbnlMaXN0BQZOVU1SRVMJAAIBCQCsAgICDkFycmF5IHNpemUgaXMgCQCkAwEJAJADAQUKdmFsQW55TGlzdAoBBGNvbnYCA2FjYwRpdGVtBAckbWF0Y2gxBQRpdGVtAwkAAQIFByRtYXRjaDECA0ludAQCaXQFByRtYXRjaDEJAM0IAgUDYWNjCQCkAwEFAml0CQACAQIUTGlzdCB0eXBlIGlzIG5vdCBJbnQEAXIKAAIkbAUKdmFsQW55TGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEY29udgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAuQkCBQFyAgFfCQACAQIWZmFpbCB0byBjYXN0IGludG8gTGlzdAENYXNTcGxpdFJlc3VsdAEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIWKExpc3RbQW55XSwgTGlzdFtBbnldKQQCdDIFByRtYXRjaDAJAJQKAgkBEmFzTGlzdEludENvbXBhY3RlZAEIBQJ0MgJfMQkBEmFzTGlzdEludENvbXBhY3RlZAEIBQJ0MgJfMgkAAgECHmZhaWwgdG8gY2FzdCBpbnRvIChMaXN0LCBMaXN0KQEOd2FsbGV0SW50ZXJuYWwBDnVzZXJBZGRyZXNzT3B0BARhZGRyCQCmCAEFDnVzZXJBZGRyZXNzT3B0BAdiYWxhbmNlAwkBCWlzRGVmaW5lZAEFBGFkZHIJAO8HAQkBBXZhbHVlAQUEYWRkcgkBDkJhbGFuY2VEZXRhaWxzBAAAAAAAAAAABAt1c2R0QmFsYW5jZQMJAQlpc0RlZmluZWQBBQRhZGRyCQDwBwIJAQV2YWx1ZQEFBGFkZHIFC3VzZHRBc3NldElkAAAEDXdsZ29sZEJhbGFuY2UDCQEJaXNEZWZpbmVkAQUEYWRkcgkA8AcCCQEFdmFsdWUBBQRhZGRyBQp3bGdBc3NldElkAAAECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5QWRkcmVzc1RvQ3VzdG9tTmFtZQEFDnVzZXJBZGRyZXNzT3B0BQ51c2VyQWRkcmVzc09wdAQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQ51c2VyQWRkcmVzc09wdAQFcmVmQnkJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQhyZWZCeUtleQQEcmVmcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARNrZXlBZGRyZXNzUmVmZXJyYWxzAQUOdXNlckFkZHJlc3NPcHQCAAQIbGFzdFR4SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5TGFzdFR4SWRCeVVzZXIBBQ51c2VyQWRkcmVzc09wdAIABAZwaWVjZXMJAJEDAgkBDmdldFZvdGluZ1Bvd2VyAQUOdXNlckFkZHJlc3NPcHQFCklkeEVmZlVzZXIEAnhwCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBCWtleVVzZXJYUAEFDnVzZXJBZGRyZXNzT3B0AAAEA2x2bAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQ51c2VyQWRkcmVzc09wdAAABApmcmVlUG9pbnRzCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBEWtleVVzZXJGcmVlUG9pbnRzAQUOdXNlckFkZHJlc3NPcHQAAAQHb25ib2FyZAMJAQlpc0RlZmluZWQBBQVyZWZCeQkArAICBQpBUlRPTkJPQVJEAwMJAQlpc0RlZmluZWQBBQRhZGRyCQEJaXNEZWZpbmVkAQkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARxrZXlPbmJvYXJkQXJ0RHVja0FjdGl2YXRlZEJ5AQUOdXNlckFkZHJlc3NPcHQHAgI6MQICOjACAAkAzAgCCQCsAgICEiVzJXNfX2N1c3RvbU5hbWVfXwUKY3VzdG9tTmFtZQkAzAgCCQCsAgICEiVzJXNfX3JlZmVycmVkQnlfXwkBC3ZhbHVlT3JFbHNlAgUFcmVmQnkCAAkAzAgCCQCsAgICESVzJXNfX3JlZmVycmFsc19fBQRyZWZzCQDMCAIJAKwCAgIQJXMlc19fbGFzdFR4SWRfXwUIbGFzdFR4SWQJAMwIAgkArAICAhQlcyVkX193YXZlc0JhbGFuY2VfXwkApAMBCAUHYmFsYW5jZQlhdmFpbGFibGUJAMwIAgkArAICAhUlcyVkX193bGdvbGRCYWxhbmNlX18JAKQDAQUNd2xnb2xkQmFsYW5jZQkAzAgCCQCsAgICEyVzJWRfX3VzZHRCYWxhbmNlX18JAKQDAQULdXNkdEJhbGFuY2UJAMwIAgkArAICAhQlcyVkX19zdGFrZWRQaWVjZXNfXwkApAMBBQZwaWVjZXMJAMwIAgkArAICAhElcyVkX19jdXJyZW50WHBfXwkApAMBBQJ4cAkAzAgCCQCsAgICEiVzJWRfX2N1cnJlbnRMdmxfXwkApAMBBQNsdmwJAMwIAgkArAICAholcyVkX19wb2ludHNUb0Rpc3RyaWJ1dGVfXwkApAMBBQpmcmVlUG9pbnRzCQDMCAIJAKwCAgIXJXMlc19fd2FsbGV0QXJ0ZWZhY3RzX18FB29uYm9hcmQFA25pbAEMYXBwbHlCb251c2VzAgtsYW5kQXNzZXRJZAZwaWVjZXMECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAAECWFydFBpZWNlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJASBrZXlMYW5kQXJ0U3RhdHVzQnlUeXBlQW5kQXNzZXRJZAIFCkFSVFBSRVNBTEUFC2xhbmRBc3NldElkAAAEBGFkZDYJAGkCBQppbmZyYUxldmVsAAYEBGFkZDcJAGkCBQppbmZyYUxldmVsAAcJAJUKAwUKaW5mcmFMZXZlbAUJYXJ0UGllY2VzCQBkAgkAZAIFD0RBSUxZUkVTQllQSUVDRQkAawMFD0RBSUxZUkVTQllQSUVDRQkAZAIJAGQCBQppbmZyYUxldmVsBQRhZGQ2CQBoAgACBQRhZGQ3AAUJAGsDBQ9EQUlMWVJFU0JZUElFQ0UFCWFydFBpZWNlcwkAaAIFBnBpZWNlcwAFARdnZXRXYXJlaG91c2VUb3RhbFZvbHVtZQEJdm9sUHJlZml4BAVwYXJ0cwkAtQkCBQl2b2xQcmVmaXgCAV8JAGgCCQBoAgUMV0hNVUxUSVBMSUVSCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAEAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAABDGdldFdhcmVob3VzZQMFd2hLZXkJbGFuZEluZGV4CmluZnJhTGV2ZWwECXZvbFByZWZpeAkArAICCQCsAgIJAKQDAQUJbGFuZEluZGV4AgFfCQCkAwEFCmluZnJhTGV2ZWwEBHRvdFMJAKQDAQkBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQUJdm9sUHJlZml4BAV3aFN0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QFBXdoS2V5CQCsAgIJAKwCAgkArAICCQCsAgIFCXZvbFByZWZpeAIeOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOjowXzBfBQR0b3RTAgFfBQR0b3RTCQC1CQIFBXdoU3RyAgE6AQ1kdWNrSW5mb1R1cGxlAQtkdWNrQXNzZXRJZAkAlwoFCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtkdWNrQXNzZXRJZAD///////////8BCAkBBXZhbHVlAQkA7AcBCQDZBAEFC2R1Y2tBc3NldElkBG5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQCAAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQA////////////AQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCE2dldEJhY2twYWNrUkVBRE9OTFkJAMwIAgULZHVja0Fzc2V0SWQFA25pbAUDbmlsAQ1kdWNrSW5mb0FycmF5AwtkdWNrQXNzZXRJZAVvd25lcgdkdWNrSW5mBApjdXN0b21OYW1lCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBGmtleUR1Y2tBc3NldElkVG9DdXN0b21OYW1lAQULZHVja0Fzc2V0SWQIBQdkdWNrSW5mAl8yBAVjaGFycwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrQ2hhcnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wBAJ4cAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQlrZXlEdWNrWFABBQtkdWNrQXNzZXRJZAAABANsdmwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAQKZnJlZVBvaW50cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARFrZXlEdWNrRnJlZVBvaW50cwEFC2R1Y2tBc3NldElkAAAEBmVxdWlwbQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARBrZXlEdWNrRXF1aXBtZW50AQULZHVja0Fzc2V0SWQCCztfO187XztfO187CQDMCAIJAKwCAgIPJXMlc19fYXNzZXRJZF9fBQtkdWNrQXNzZXRJZAkAzAgCCQCsAgICDSVzJXNfX293bmVyX18FBW93bmVyCQDMCAIJAKwCAgISJXMlc19fY3VzdG9tTmFtZV9fBQpjdXN0b21OYW1lCQDMCAIJAKwCAgISJXMlZF9fc3Rha2VkVGltZV9fCQCkAwEIBQdkdWNrSW5mAl8xCQDMCAIJAKwCAgIMJXMlc19fbmFtZV9fCAUHZHVja0luZgJfMgkAzAgCCQCsAgICECVzJXNfX2xvY2F0aW9uX18IBQdkdWNrSW5mAl8zCQDMCAIJAKwCAgIOJXMlZF9faGVhbHRoX18JAKQDAQgFB2R1Y2tJbmYCXzQJAMwIAgkArAICAhElcyVkX19tYXhIZWFsdGhfXwkApAMBCQEJbWF4SGVhbHRoAQUDbHZsCQDMCAIJAKwCAgIXJXMlc19fY2hhcmFjdGVyaXN0aWNzX18FBWNoYXJzCQDMCAIJAKwCAgIRJXMlZF9fY3VycmVudFhwX18JAKQDAQUCeHAJAMwIAgkArAICAhIlcyVkX19jdXJyZW50THZsX18JAKQDAQUDbHZsCQDMCAIJAKwCAgIaJXMlZF9fcG9pbnRzVG9EaXN0cmlidXRlX18JAKQDAQUKZnJlZVBvaW50cwkAzAgCCQCsAgICECVzJXNfX2JhY2tQYWNrX18IBQdkdWNrSW5mAl81CQDMCAIJAKwCAgIRJXMlc19fZXF1aXBtZW50X18FBmVxdWlwbQUDbmlsAQ1sYW5kSW5mb0FycmF5AwtsYW5kQXNzZXRJZAVvd25lcgpzdGFrZWRUaW1lAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQBYQkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAFkCQC1CQIIBQFhC2Rlc2NyaXB0aW9uAgFfBAdsYW5kTnVtAwkAZgIIBQFhCHF1YW50aXR5AAAJAJEDAgUBZAUKcmVjTGFuZE51bQkArAICAgEtCQCRAwIFAWQFCnJlY0xhbmROdW0EBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgUBZAULcmVjTGFuZFNpemUEDHByb2R1Y3Rpdml0eQkBDGFwcGx5Qm9udXNlcwIFC2xhbmRBc3NldElkBQZwaWVjZXMECWRlbHRhVGltZQkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQpzdGFrZWRUaW1lBAhhdmFpbFJlcwMJAGYCBQpzdGFrZWRUaW1lAAAJAGsDBQlkZWx0YVRpbWUJAGgCCAUMcHJvZHVjdGl2aXR5Al8zBQZwaWVjZXMFCURBWU1JTExJUwAABAduZWVkTWF0CQBrAwURSW5mcmFVcGdyYWRlQ29zdFMJAGgCBQZwaWVjZXMJAGQCCAUMcHJvZHVjdGl2aXR5Al8xAAEFBVNTSVpFBA5nbG9iYWxBbmRMb2NhbAMJAGYCBQpzdGFrZWRUaW1lAAAJAQ1hc1NwbGl0UmVzdWx0AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCJHNwbGl0QnlHbG9iYWxBbmRMb2NhbFdlaWdodHNSRUFET05MWQkAzAgCBQduZWVkTWF0CQDMCAIFCGF2YWlsUmVzCQDMCAIJAJEDAgUBZAULcmVjVGVycmFpbnMFA25pbAUDbmlsCQCUCgIJARJhc0xpc3RJbnRDb21wYWN0ZWQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIcc3BsaXRCeUdsb2JhbFdlaWdodHNSRUFET05MWQkAzAgCBQduZWVkTWF0BQNuaWwFA25pbAIABApjdXN0b21OYW1lCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBGmtleUxhbmRBc3NldElkVG9DdXN0b21OYW1lAQULbGFuZEFzc2V0SWQJAKwCAgkArAICCQCRAwIFAWQFDHJlY0NvbnRpbmVudAIBLQkAkQMCBQFkBQpyZWNMYW5kTnVtCQDMCAIJAKwCAgIPJXMlc19fYXNzZXRJZF9fBQtsYW5kQXNzZXRJZAkAzAgCCQCsAgICDSVzJXNfX293bmVyX18FBW93bmVyCQDMCAIJAKwCAgISJXMlc19fY3VzdG9tTmFtZV9fBQpjdXN0b21OYW1lCQDMCAIJAKwCAgISJXMlZF9fc3Rha2VkVGltZV9fCQCkAwEFCnN0YWtlZFRpbWUJAMwIAgkArAICAhMlcyVzX19kZXNjcmlwdGlvbl9fCQC5CQIJAMwIAgUHbGFuZE51bQkAzAgCCQCRAwIFAWQFC3JlY0xhbmRTaXplCQDMCAIJAJEDAgUBZAULcmVjVGVycmFpbnMJAMwIAgkAkQMCBQFkBQxyZWNDb250aW5lbnQFA25pbAIBXwkAzAgCCQCsAgICEiVzJWRfX2luZnJhTGV2ZWxfXwkApAMBCAUMcHJvZHVjdGl2aXR5Al8xCQDMCAIJAKwCAgIWJXMlc19fYXZhaWxSZXNCeVR5cGVfXwgFDmdsb2JhbEFuZExvY2FsAl8yCQDMCAIJAKwCAgIVJXMlZF9fYXZhaWxSZXNUb3RhbF9fCQCkAwEFCGF2YWlsUmVzCQDMCAIJAKwCAgIUJXMlc19fbmVlZE1hdGVyaWFsX18IBQ5nbG9iYWxBbmRMb2NhbAJfMQkAzAgCCQCsAgICHSVzJXNfX2xhbmRBcnRlZmFjdHNfX1BSRVNBTEU6CQCkAwEIBQxwcm9kdWN0aXZpdHkCXzIJAMwIAgkArAICAhElcyVzX193YXJlaG91c2VfXwkAuQkCCQEMZ2V0V2FyZWhvdXNlAwkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkCQBpAgUGcGllY2VzBQVTU0laRQgFDHByb2R1Y3Rpdml0eQJfMQIBOgkAzAgCCQCsAgICESVzJXNfX2xhbmRPcmRlcl9fCQELdmFsdWVPckVsc2UCCQCdCAIFD2Vjb25vbXlDb250cmFjdAkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQCMDBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOjBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOgUDbmlsARJsYW5kT3JkZXJJbmZvQXJyYXkCC2xhbmRBc3NldElkBW93bmVyAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQBYQkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAFkCQC1CQIIBQFhC2Rlc2NyaXB0aW9uAgFfBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIFAWQFC3JlY0xhbmRTaXplBAxwcm9kdWN0aXZpdHkJAQxhcHBseUJvbnVzZXMCBQtsYW5kQXNzZXRJZAUGcGllY2VzCQDMCAIJAKwCAgIPJXMlc19fYXNzZXRJZF9fBQtsYW5kQXNzZXRJZAkAzAgCCQCsAgICDSVzJXNfX293bmVyX18FBW93bmVyCQDMCAIJAKwCAgIRJXMlc19fd2FyZWhvdXNlX18JALkJAgkBDGdldFdhcmVob3VzZQMJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAkAaQIFBnBpZWNlcwUFU1NJWkUIBQxwcm9kdWN0aXZpdHkCXzECAToJAMwIAgkArAICAhElcyVzX19sYW5kT3JkZXJfXwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9lY29ub215Q29udHJhY3QJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkAjAwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDowQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDoFA25pbA8BaQENY29uc3RydWN0b3JWMQEJY29udHJhY3RzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIScGVybWlzc2lvbnMgZGVuaWVkCgEKZGVzY3JpcHRvcgIDYWNjC2lnbm9yZWRJdGVtCQCsAgIFA2FjYwICJXMEBWRlc2NyCgACJGwFCWNvbnRyYWN0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKZGVzY3JpcHRvcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5UmVzdENmZwAJALkJAgkAzAgCBQVkZXNjcgUJY29udHJhY3RzBQNTRVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVJlc3RBZGRyZXNzAAkApQgBBQR0aGlzBQNuaWwBaQESd2FsbGV0SW5mb1JFQURPTkxZAQ51c2VyQWRkcmVzc09wdAkAlAoCBQNuaWwJAQ53YWxsZXRJbnRlcm5hbAEFDnVzZXJBZGRyZXNzT3B0AWkBF2R1Y2tCeU93bmVySW5mb1JFQURPTkxZAQt1c2VyQWRkcmVzcwQKc3Rha2VkRHVjawkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFC3VzZXJBZGRyZXNzCQCUCgIFA25pbAMDCQEJaXNEZWZpbmVkAQkApggBBQt1c2VyQWRkcmVzcwkBCWlzRGVmaW5lZAEFCnN0YWtlZER1Y2sHBAtkdWNrQXNzZXRJZAkBBXZhbHVlAQUKc3Rha2VkRHVjawkBDWR1Y2tJbmZvQXJyYXkDBQtkdWNrQXNzZXRJZAULdXNlckFkZHJlc3MJAQ1kdWNrSW5mb1R1cGxlAQULZHVja0Fzc2V0SWQJAQ1kdWNrSW5mb0FycmF5AwIABQt1c2VyQWRkcmVzcwkAlwoFAP///////////wECAAIAAP///////////wECAAFpARlkdWNrQnlBc3NldElkSW5mb1JFQURPTkxZAQtkdWNrQXNzZXRJZAQFb3duZXIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEQa2V5RHVja0lkVG9Pd25lcgEFC2R1Y2tBc3NldElkBAdkdWNrSW5mCQENZHVja0luZm9UdXBsZQEFC2R1Y2tBc3NldElkCQCUCgIFA25pbAkBDWR1Y2tJbmZvQXJyYXkDBQtkdWNrQXNzZXRJZAMJAQlpc0RlZmluZWQBBQVvd25lcgkBBXZhbHVlAQUFb3duZXICAAkBDWR1Y2tJbmZvVHVwbGUBBQtkdWNrQXNzZXRJZAFpARlsYW5kQnlBc3NldElkSW5mb1JFQURPTkxZAQtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQECnN0YWtlZFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAP///////////wEEBW93bmVyAwkAZgIFCnN0YWtlZFRpbWUAAAkBBXZhbHVlAQkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAIACQCUCgIFA25pbAkBDWxhbmRJbmZvQXJyYXkDBQtsYW5kQXNzZXRJZAUFb3duZXIFCnN0YWtlZFRpbWUBaQEec3Rha2VkTGFuZHNCeU93bmVySW5mb1JFQURPTkxZARBsYW5kT3duZXJBZGRyZXNzAwkAAAIFEGxhbmRPd25lckFkZHJlc3MCAAkAAgECHGxhbmRPd25lckFkZHJlc3MgaXMgcmVxdWlyZWQECGxhbmRzU3RyCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFEGxhbmRPd25lckFkZHJlc3MEBWxhbmRzAwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfBQNuaWwKAQdvbmVMYW5kAgNhY2MLbGFuZEFzc2V0SWQDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBApzdGFrZWRUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAD///////////8BCQDNCAIFA2FjYwkBDWxhbmRJbmZvQXJyYXkDBQtsYW5kQXNzZXRJZAUQbGFuZE93bmVyQWRkcmVzcwUKc3Rha2VkVGltZQQBcgoAAiRsBQVsYW5kcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHb25lTGFuZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIVTGlzdCBzaXplIGV4Y2VlZHMgMTAwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEF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ZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQA////////////AQQFb3duZXIDCQBmAgUKc3Rha2VkVGltZQAACQEFdmFsdWUBCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkAgAJAJQKAgUDbmlsCQESbGFuZE9yZGVySW5mb0FycmF5AgULbGFuZEFzc2V0SWQFBW93bmVyAWkBG29yZGVyc0J5TGFuZElkc0luZm9SRUFET05MWQEMbGFuZEFzc2V0SWRzCgEHb25lTGFuZAIDYWNjC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQKc3Rha2VkVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQA////////////AQQFb3duZXIDCQBmAgUKc3Rha2VkVGltZQAACQEFdmFsdWUBCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkAgAJAM0IAgUDYWNjCQESbGFuZE9yZGVySW5mb0FycmF5AgULbGFuZEFzc2V0SWQFBW93bmVyBAFyCgACJGwFDGxhbmRBc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHb25lTGFuZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAkAlAoCBQNuaWwFAXIBaQEVY2FuY2VsV2FyZWhvdXNlT3JkZXJzAQxsYW5kQXNzZXRJZHMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAQHYmxvY2tlZAkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAMDCQEBIQEJAQlpc0RlZmluZWQBBQdibG9ja2VkBgkAAAIJAQV2YWx1ZQEFB2Jsb2NrZWQHCQACAQIzQ29udHJhY3RzIHNob3VsZCBiZSBibG9ja2VkIGJlZm9yZSBjYW5jZWxpbmcgb3JkZXJzCgEHb25lTGFuZAIBYQtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQEAWMJAQlhc0Jvb2xlYW4BCQD8BwQFD2Vjb25vbXlDb250cmFjdAIRc2V0V2FyZWhvdXNlT3JkZXIJAMwIAgIwMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6MEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6CQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAMDBQFhBgUBYwkBASEBAwUBYQUBYwcHBAFyCgACJGwFDGxhbmRBc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdvbmVMYW5kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgkAlAoCBQNuaWwFAXIBaQETZml4V2FyZWhvdXNlRm9ybWF0cwEMbGFuZEFzc2V0SWRzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRcGVybWlzc2lvbiBkZW5pZWQKAQdvbmVMYW5kAgNhY2MLbGFuZEFzc2V0SWQDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkCQBkAgUDYWNjCQCxAgEJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhJmaXhXYXJlaG91c2VGb3JtYXQJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAFyCgACJGwFDGxhbmRBc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHb25lTGFuZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQkAlAoCBQNuaWwFAXIBaQEPZml4U3Rha2VkUGllY2VzAQV1c2VycwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEXBlcm1pc3Npb24gZGVuaWVkCgEHb25lVXNlcgIDYWNjBGFkZHIDCQAAAgUEYWRkcgIACQACAQITYWRkcmVzcyBpcyByZXF1aXJlZAkAZAIFA2FjYwkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD2ZpeFN0YWtlZFBpZWNlcwkAzAgCBQRhZGRyBQNuaWwFA25pbAQBcgoAAiRsBQV1c2VycwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHb25lVXNlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAkAlAoCBQNuaWwFAXIBaQENc2VuZFVzZHRQcml6ZQELdXNlckFkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECEXBlcm1pc3Npb24gZGVuaWVkBANhbXQJAGsDCQDwBwIFBHRoaXMFC3VzZHRBc3NldElkBQ1VU0RUUFJJWkVQQVJUBQVNVUxUNgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQNhbXQFC3VzZHRBc3NldElkBQNuaWwFA2FtdAFpAR9nZXRFbWVyZ2VuY3lTZXJ2aWNlRGF0YVJFQURPTkxZAAQIZXhpc3RTdHIJAJ0IAgUPZWNvbm9teUNvbnRyYWN0CQEOa2V5RXNXYXJlaG91c2UABAxleGlzdEFtb3VudHMDCQEJaXNEZWZpbmVkAQUIZXhpc3RTdHIJALUJAgkBBXZhbHVlAQUIZXhpc3RTdHICAV8FA25pbAoBCnNpbmdsZVByb2QCA2FjYwlyZWNpcGVTdHIEAW4IBQNhY2MCXzIEBnJlY2lwZQkAtQkCBQlyZWNpcGVTdHICAV8ECW1heEFtb3VudAMJAAACBQFuAAAJAGgCBQ1FU01BWFBBQ0tBR0VTBQ5QUk9EVUNUUEtHU0laRQAABAtleGlzdEFtb3VudAMJAGYCCQCQAwEFDGV4aXN0QW1vdW50cwUBbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGV4aXN0QW1vdW50cwUBbgAABAh0b3RhbE1hdAkBEmdldFJlY2lwZU1hdGVyaWFscwEFBnJlY2lwZQQIYnV5UHJpY2UJAGsDCQBoAgUIdG90YWxNYXQFCUVTQlVZQ09FRgUQUkVTT1VSQ0VQUklDRU1JTgkAaAIACgUOUFJPRFVDVFBLR1NJWkUECXNlbGxQcmljZQkAawMJAGgCBQh0b3RhbE1hdAUKRVNTRUxMQ09FRgUQUkVTT1VSQ0VQUklDRU1JTgkAaAIACgUOUFJPRFVDVFBLR1NJWkUEAXkJALkJAgkAzAgCCQCkAwEFCW1heEFtb3VudAkAzAgCCQCkAwEFC2V4aXN0QW1vdW50CQDMCAIJAKQDAQUIYnV5UHJpY2UJAMwIAgkApAMBBQlzZWxsUHJpY2UFA25pbAIBXwkAlAoCCQDNCAIIBQNhY2MCXzEFAXkJAGQCBQFuAAEEAXMJALoJAggKAAIkbAUQcHJvZHVjdGlvbk1hdHJpeAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCnNpbmdsZVByb2QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgJfMQIBOgQGcmVzdWx0CQCsAgICHCVzJXNfX2VtZXJnZW5jeVNlcnZpY2VEYXRhX18FAXMJAJQKAgUDbmlsBQZyZXN1bHQBaQEQd2xnU3RhdHNSRUFET05MWQELdXNlckFkZHJPcHQECGN1clN0YXRzCQELZ2V0V2xnU3RhdHMEBQt1c2VyQWRkck9wdAkAzAgCBQxyZXN0Q29udHJhY3QJAMwIAgUPc3Rha2luZ0NvbnRyYWN0CQDMCAIFD2Vjb25vbXlDb250cmFjdAkAzAgCBQtnb3ZDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAkAlAoCBQNuaWwJAMwIAgkArAICAhMlcyVzJWRfX3dsZ0Ftb3VudF9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFDGlkeFdsZ0Ftb3VudAkAzAgCCQCsAgICEiVzJXMlZF9fd2xnUHJpY2VfXwkApAMBCQCRAwIFCGN1clN0YXRzBQtpZHhXbGdQcmljZQkAzAgCCQCsAgICEyVzJXMlZF9fdXNkdEZ1bmRzX18JAKQDAQkAkQMCBQhjdXJTdGF0cwULaWR4V2xnRnVuZHMJAMwIAgkArAICAhUlcyVzJWRfX3VzZHRFY29ub215X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUNaWR4V2xnRWNvbm9teQkAzAgCCQCsAgICFiVzJXMlZF9fdXNkdEFjdGl2aXR5X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUOaWR4V2xnQWN0aXZpdHkJAMwIAgkArAICAhclcyVzJWRfX3VzZHRBcmJpdHJhZ2VfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ9pZHhXbGdBcmJpdHJhZ2UJAMwIAgkArAICAhIlcyVzJWRfX3VzZHRQb29sX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUKaWR4V2xnUG9vbAkAzAgCCQCsAgICFiVzJXMlZF9fd2xnSXNzdWVUaW1lX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnSXNzdWVUaW1lCQDMCAIJAKwCAgIlJXMlcyVkX193bGdMYXN0TWFya2V0aW5nVGVhbUFjdFRpbWVfXwkApAMBCQCRAwIFCGN1clN0YXRzBRFpZHhXbGdMYXN0TVRBVGltZQkAzAgCCQCsAgICGyVzJXMlZF9fd2xnTWFya2V0aW5nVG90YWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBRRpZHhXbGdNYXJrZXRpbmdUb3RhbAkAzAgCCQCsAgICHCVzJXMlZF9fd2xnTWFya2V0aW5nQW1MZWZ0X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUVaWR4V2xnTWFya2V0aW5nQW1MZWZ0CQDMCAIJAKwCAgIgJXMlcyVkX193bGdNYXJrZXRpbmdBbUF2YWlsTm93X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUZaWR4V2xnTWFya2V0aW5nQW1BdmFpbE5vdwkAzAgCCQCsAgICHCVzJXMlZF9fd2xnTWFya2V0aW5nV2xnb2xkX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUVaWR4V2xnTWFya2V0aW5nV2xnb2xkCQDMCAIJAKwCAgIWJXMlcyVkX193bGdUZWFtVG90YWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ9pZHhXbGdUZWFtVG90YWwJAMwIAgkArAICAhclcyVzJWRfX3dsZ1RlYW1BbUxlZnRfXwkApAMBCQCRAwIFCGN1clN0YXRzBRBpZHhXbGdUZWFtQW1MZWZ0CQDMCAIJAKwCAgIbJXMlcyVkX193bGdUZWFtQW1BdmFpbE5vd19fCQCkAwEJAJEDAgUIY3VyU3RhdHMFFGlkeFdsZ1RlYW1BbUF2YWlsTm93CQDMCAIJAKwCAgIXJXMlcyVkX193bGdUZWFtV2xnb2xkX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUQaWR4V2xnVGVhbVdsZ29sZAkAzAgCCQCsAgICFSVzJXMlZF9fd2xnQWN0VG90YWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ5pZHhXbGdBY3RUb3RhbAkAzAgCCQCsAgICFiVzJXMlZF9fd2xnQWN0QW1MZWZ0X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnQWN0QW1MZWZ0CQDMCAIJAKwCAgIaJXMlcyVkX193bGdBY3RBbUF2YWlsTm93X18JAKQDAQkAkQMCBQhjdXJTdGF0cwUTaWR4V2xnQWN0QW1BdmFpbE5vdwkAzAgCCQCsAgICFiVzJXMlZF9fd2xnQWN0V2xnb2xkX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnQWN0V2xnb2xkCQDMCAIJAKwCAgIWJXMlcyVkX193bGdDdXJQZXJpb2RfXwkApAMBCQCRAwIFCGN1clN0YXRzBQ9pZHhXbGdDdXJQZXJpb2QJAMwIAgkArAICAhglcyVzJWRfX3dsZ0FtTGVmdFRvdGFsX18JAKQDAQkAkQMCBQhjdXJTdGF0cwURaWR4V2xnQW1MZWZ0VG90YWwJAMwIAgkArAICAiIlcyVzJWRfX3dsZ0N1clBlcmlvZERpc3RyaWJ1dGlvbl9fCQCkAwEJAJEDAgUIY3VyU3RhdHMFG2lkeFdsZ0N1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCCQCsAgICGSVzJXMlZF9fd2xnTGFzdFVzZXJUaW1lX18JAKQDAQkAkQMCBQhjdXJTdGF0cwUSaWR4V2xnTGFzdFVzZXJUaW1lCQDMCAIJAKwCAgIbJXMlcyVkX193bGdVc2VyQW1BdmFpbE5vd19fCQCkAwEJAJEDAgUIY3VyU3RhdHMFFGlkeFdsZ1VzZXJBbUF2YWlsTm93CQDMCAIJAKwCAgIcJXMlcyVkX193bGdHdWVzdFNMYW5kRGFpbHlfXwkApAMBCQCRAwIFCGN1clN0YXRzBRZpZHhXbGdTTGFuZERhaWx5QW1vdW50CQDMCAIJAKwCAgIcJXMlcyVkX193bGdJbnZlc3RGdW5kVG90YWxfXwkApAMBCQCRAwIFCGN1clN0YXRzBRZpZHhXbGdJbnZlc3RGdW5kQW1vdW50BQNuaWwAENa+bQ==", "height": 2680209, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7y7YFye6eYvuFc8HZC6uY6Ld3ckoeH9LaHP414BqS6YA Next: 9bTLu1oCarJigoRELrctHHa6JTPjtQGLRaqU81LzWkdP Diff:
OldNewDifferences
4646 let wlgIssueTimeKey = "wlg_issueTime"
4747
4848 let wlgIssuedAmountKey = "wlg_issuedAmount"
49+
50+let zbIssuedAmountKey = "zbill_issuedAmount"
4951
5052 let idxWlgAmount = 0
5153
101103
102104 let idxWlgSLandDailyAmount = 26
103105
106+let idxWlgInvestFundAmount = 27
107+
104108 let dappRest = 0
105109
106110 let dappStaking = 1
110114 let dappWlg = 4
111115
112116 let dappPuzzle = 5
117+
118+let dappInvestFund = 6
113119
114120 func getPieces (userAddrStrOrEmpty,stakingContract) = {
115121 let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
140146 let restUsd = assetBalance(contracts[dappRest], usdtId)
141147 let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
142148 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
143- let totalFundsUsd = (economyUsd + wlgUsd)
149+ let investFundContract = contracts[dappInvestFund]
150+ let investFundTotal = (assetBalance(investFundContract, usdtId) + valueOrElse(getInteger(investFundContract, zbIssuedAmountKey), 0))
151+ let totalFundsUsd = ((economyUsd + wlgUsd) + investFundTotal)
144152 let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
145153 let now = lastBlock.timestamp
146154 let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
174182 else ((fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS) + distributionByPeriod((curPeriod - 1))) + fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)), eff[1], eff[0])
175183 let sLandDailyAmount = fraction(fraction(curPeriodDistribution, DAY, YEARMILLIS), 25, eff[0])
176184 let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
177-[issuedAmount, fraction(totalFundsUsd, M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastMarketingTime, marketingTotal, marketingAmountLeft, marketingAmountAvailableNow, marketingWlgold, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, userAmount, sLandDailyAmount]
185+[issuedAmount, fraction(totalFundsUsd, M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastMarketingTime, marketingTotal, marketingAmountLeft, marketingAmountAvailableNow, marketingWlgold, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, userAmount, sLandDailyAmount, investFundTotal]
178186 }
187+
188+
189+func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
179190
180191
181192 func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
278289 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
279290
280291
281-func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
282-
283-
284292 func keyBlocked () = "contractsBlocked"
285293
286294
349357
350358 let IdxCfgPuzzlePoolDapp = 5
351359
360+let IdxCfgInvestFundDapp = 6
361+
352362 func keyRestCfg () = "%s__restConfig"
353363
354364
374384 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
375385
376386 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
387+
388+let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
377389
378390 let recLandNum = 0
379391
934946 @Callable(i)
935947 func wlgStatsREADONLY (userAddrOpt) = {
936948 let curStats = getWlgStats(userAddrOpt, [restContract, stakingContract, economyContract, govContract, wlgContract, puzzlePoolContract], usdtAssetId, 0)
937- $Tuple2(nil, [("%s%s%d__wlgAmount__" + toString(curStats[idxWlgAmount])), ("%s%s%d__wlgPrice__" + toString(curStats[idxWlgPrice])), ("%s%s%d__usdtFunds__" + toString(curStats[idxWlgFunds])), ("%s%s%d__usdtEconomy__" + toString(curStats[idxWlgEconomy])), ("%s%s%d__usdtActivity__" + toString(curStats[idxWlgActivity])), ("%s%s%d__usdtArbitrage__" + toString(curStats[idxWlgArbitrage])), ("%s%s%d__usdtPool__" + toString(curStats[idxWlgPool])), ("%s%s%d__wlgIssueTime__" + toString(curStats[idxWlgIssueTime])), ("%s%s%d__wlgLastMarketingTeamActTime__" + toString(curStats[idxWlgLastMTATime])), ("%s%s%d__wlgMarketingTotal__" + toString(curStats[idxWlgMarketingTotal])), ("%s%s%d__wlgMarketingAmLeft__" + toString(curStats[idxWlgMarketingAmLeft])), ("%s%s%d__wlgMarketingAmAvailNow__" + toString(curStats[idxWlgMarketingAmAvailNow])), ("%s%s%d__wlgMarketingWlgold__" + toString(curStats[idxWlgMarketingWlgold])), ("%s%s%d__wlgTeamTotal__" + toString(curStats[idxWlgTeamTotal])), ("%s%s%d__wlgTeamAmLeft__" + toString(curStats[idxWlgTeamAmLeft])), ("%s%s%d__wlgTeamAmAvailNow__" + toString(curStats[idxWlgTeamAmAvailNow])), ("%s%s%d__wlgTeamWlgold__" + toString(curStats[idxWlgTeamWlgold])), ("%s%s%d__wlgActTotal__" + toString(curStats[idxWlgActTotal])), ("%s%s%d__wlgActAmLeft__" + toString(curStats[idxWlgActAmLeft])), ("%s%s%d__wlgActAmAvailNow__" + toString(curStats[idxWlgActAmAvailNow])), ("%s%s%d__wlgActWlgold__" + toString(curStats[idxWlgActWlgold])), ("%s%s%d__wlgCurPeriod__" + toString(curStats[idxWlgCurPeriod])), ("%s%s%d__wlgAmLeftTotal__" + toString(curStats[idxWlgAmLeftTotal])), ("%s%s%d__wlgCurPeriodDistribution__" + toString(curStats[idxWlgCurPeriodDistribution])), ("%s%s%d__wlgLastUserTime__" + toString(curStats[idxWlgLastUserTime])), ("%s%s%d__wlgUserAmAvailNow__" + toString(curStats[idxWlgUserAmAvailNow])), ("%s%s%d__wlgGuestSLandDaily__" + toString(curStats[idxWlgSLandDailyAmount]))])
949+ $Tuple2(nil, [("%s%s%d__wlgAmount__" + toString(curStats[idxWlgAmount])), ("%s%s%d__wlgPrice__" + toString(curStats[idxWlgPrice])), ("%s%s%d__usdtFunds__" + toString(curStats[idxWlgFunds])), ("%s%s%d__usdtEconomy__" + toString(curStats[idxWlgEconomy])), ("%s%s%d__usdtActivity__" + toString(curStats[idxWlgActivity])), ("%s%s%d__usdtArbitrage__" + toString(curStats[idxWlgArbitrage])), ("%s%s%d__usdtPool__" + toString(curStats[idxWlgPool])), ("%s%s%d__wlgIssueTime__" + toString(curStats[idxWlgIssueTime])), ("%s%s%d__wlgLastMarketingTeamActTime__" + toString(curStats[idxWlgLastMTATime])), ("%s%s%d__wlgMarketingTotal__" + toString(curStats[idxWlgMarketingTotal])), ("%s%s%d__wlgMarketingAmLeft__" + toString(curStats[idxWlgMarketingAmLeft])), ("%s%s%d__wlgMarketingAmAvailNow__" + toString(curStats[idxWlgMarketingAmAvailNow])), ("%s%s%d__wlgMarketingWlgold__" + toString(curStats[idxWlgMarketingWlgold])), ("%s%s%d__wlgTeamTotal__" + toString(curStats[idxWlgTeamTotal])), ("%s%s%d__wlgTeamAmLeft__" + toString(curStats[idxWlgTeamAmLeft])), ("%s%s%d__wlgTeamAmAvailNow__" + toString(curStats[idxWlgTeamAmAvailNow])), ("%s%s%d__wlgTeamWlgold__" + toString(curStats[idxWlgTeamWlgold])), ("%s%s%d__wlgActTotal__" + toString(curStats[idxWlgActTotal])), ("%s%s%d__wlgActAmLeft__" + toString(curStats[idxWlgActAmLeft])), ("%s%s%d__wlgActAmAvailNow__" + toString(curStats[idxWlgActAmAvailNow])), ("%s%s%d__wlgActWlgold__" + toString(curStats[idxWlgActWlgold])), ("%s%s%d__wlgCurPeriod__" + toString(curStats[idxWlgCurPeriod])), ("%s%s%d__wlgAmLeftTotal__" + toString(curStats[idxWlgAmLeftTotal])), ("%s%s%d__wlgCurPeriodDistribution__" + toString(curStats[idxWlgCurPeriodDistribution])), ("%s%s%d__wlgLastUserTime__" + toString(curStats[idxWlgLastUserTime])), ("%s%s%d__wlgUserAmAvailNow__" + toString(curStats[idxWlgUserAmAvailNow])), ("%s%s%d__wlgGuestSLandDaily__" + toString(curStats[idxWlgSLandDailyAmount])), ("%s%s%d__wlgInvestFundTotal__" + toString(curStats[idxWlgInvestFundAmount]))])
938950 }
939951
940952
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let M6 = 1000000
55
66 let M8 = 100000000
77
88 let MILLION6 = 100000000000000
99
1010 let MARKETINGSHARE = 100000
1111
1212 let TEAMSHARE = 200000
1313
1414 let ACTIVITYSHARE = 100000
1515
1616 let PLAYERSHARE = 400000
1717
1818 let YEARMILLIS = 31557600000
1919
2020 let DAY = 86400000
2121
2222 let marketingAddrKey = "marketingAddr"
2323
2424 let teamAddrKey = "teamAddr"
2525
2626 let lastMarketingTimeKey = "lastClaimedTime_marketing"
2727
2828 let marketingAmountLeftKey = "marketingAmountLeft"
2929
3030 let lastTeamTimeKey = "lastClaimedTime_team"
3131
3232 let teamAmountLeftKey = "teamAmountLeft"
3333
3434 let lastActivitiesTimeKey = "lastClaimedTime_activities"
3535
3636 let actAmountLeftKey = "activitiesAmountLeft"
3737
3838 let stakersAmountLeftKey = "stakersAmountLeft"
3939
4040 func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
4141
4242
4343 func distributionByPeriod (period) = fraction(MILLION6, (PLAYERSHARE * (period + 1)), (6 * M6))
4444
4545
4646 let wlgIssueTimeKey = "wlg_issueTime"
4747
4848 let wlgIssuedAmountKey = "wlg_issuedAmount"
49+
50+let zbIssuedAmountKey = "zbill_issuedAmount"
4951
5052 let idxWlgAmount = 0
5153
5254 let idxWlgPrice = 1
5355
5456 let idxWlgFunds = 2
5557
5658 let idxWlgEconomy = 3
5759
5860 let idxWlgActivity = 4
5961
6062 let idxWlgArbitrage = 5
6163
6264 let idxWlgPool = 6
6365
6466 let idxWlgIssueTime = 7
6567
6668 let idxWlgLastMTATime = 8
6769
6870 let idxWlgMarketingTotal = 9
6971
7072 let idxWlgMarketingAmLeft = 10
7173
7274 let idxWlgMarketingAmAvailNow = 11
7375
7476 let idxWlgMarketingWlgold = 12
7577
7678 let idxWlgTeamTotal = 13
7779
7880 let idxWlgTeamAmLeft = 14
7981
8082 let idxWlgTeamAmAvailNow = 15
8183
8284 let idxWlgTeamWlgold = 16
8385
8486 let idxWlgActTotal = 17
8587
8688 let idxWlgActAmLeft = 18
8789
8890 let idxWlgActAmAvailNow = 19
8991
9092 let idxWlgActWlgold = 20
9193
9294 let idxWlgCurPeriod = 21
9395
9496 let idxWlgAmLeftTotal = 22
9597
9698 let idxWlgCurPeriodDistribution = 23
9799
98100 let idxWlgLastUserTime = 24
99101
100102 let idxWlgUserAmAvailNow = 25
101103
102104 let idxWlgSLandDailyAmount = 26
103105
106+let idxWlgInvestFundAmount = 27
107+
104108 let dappRest = 0
105109
106110 let dappStaking = 1
107111
108112 let dappEconomy = 2
109113
110114 let dappWlg = 4
111115
112116 let dappPuzzle = 5
117+
118+let dappInvestFund = 6
113119
114120 func getPieces (userAddrStrOrEmpty,stakingContract) = {
115121 let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
116122 func adder (acc,item) = (acc + parseIntValue(item))
117123
118124 let totalPower = {
119125 let $l = props
120126 let $s = size($l)
121127 let $acc0 = 0
122128 func $f0_1 ($a,$i) = if (($i >= $s))
123129 then $a
124130 else adder($a, $l[$i])
125131
126132 func $f0_2 ($a,$i) = if (($i >= $s))
127133 then $a
128134 else throw("List size exceeds 6")
129135
130136 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
131137 }
132138 let usersPower = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
133139 [totalPower, usersPower]
134140 }
135141
136142
137143 func getWlgStats (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
138144 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
139145 let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
140146 let restUsd = assetBalance(contracts[dappRest], usdtId)
141147 let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
142148 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
143- let totalFundsUsd = (economyUsd + wlgUsd)
149+ let investFundContract = contracts[dappInvestFund]
150+ let investFundTotal = (assetBalance(investFundContract, usdtId) + valueOrElse(getInteger(investFundContract, zbIssuedAmountKey), 0))
151+ let totalFundsUsd = ((economyUsd + wlgUsd) + investFundTotal)
144152 let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
145153 let now = lastBlock.timestamp
146154 let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
147155 let marketingTotal = fraction(MILLION6, MARKETINGSHARE, M6)
148156 let marketingAmountLeft = valueOrElse(getInteger(contracts[dappWlg], marketingAmountLeftKey), marketingTotal)
149157 let lastMarketingTime = valueOrElse(getInteger(contracts[dappWlg], lastMarketingTimeKey), issueTime)
150158 let marketingAddr = addressFromStringValue(value(getString(contracts[dappWlg], marketingAddrKey)))
151159 let marketingAmountAvailableNow = min([fraction(marketingTotal, (now - lastMarketingTime), YEARMILLIS), marketingAmountLeft])
152160 let marketingWlgold = assetBalance(marketingAddr, wlgId)
153161 let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
154162 let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
155163 let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
156164 let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
157165 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
158166 let teamWlgold = assetBalance(teamAddr, wlgId)
159167 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
160168 let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
161169 let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
162170 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
163171 let actWlgold = assetBalance(contracts[dappRest], wlgId)
164172 let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUser(userAddrOpt)), issueTime)
165173 let lastUserPeriod = ((lastUserTime - issueTime) / YEARMILLIS)
166174 let nowLimited = min([now, (issueTime + (3 * YEARMILLIS))])
167175 let curPeriod = min([((now - issueTime) / YEARMILLIS), 2])
168176 let eff = getPieces(userAddrOpt, contracts[dappStaking])
169177 let curPeriodDistribution = distributionByPeriod(curPeriod)
170178 let userAmount = fraction(if ((lastUserPeriod == curPeriod))
171179 then fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEARMILLIS)
172180 else if ((lastUserPeriod == (curPeriod - 1)))
173181 then (fraction(distributionByPeriod((curPeriod - 1)), ((issueTime + (YEARMILLIS * curPeriod)) - lastUserTime), YEARMILLIS) + fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS))
174182 else ((fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS) + distributionByPeriod((curPeriod - 1))) + fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)), eff[1], eff[0])
175183 let sLandDailyAmount = fraction(fraction(curPeriodDistribution, DAY, YEARMILLIS), 25, eff[0])
176184 let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
177-[issuedAmount, fraction(totalFundsUsd, M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastMarketingTime, marketingTotal, marketingAmountLeft, marketingAmountAvailableNow, marketingWlgold, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, userAmount, sLandDailyAmount]
185+[issuedAmount, fraction(totalFundsUsd, M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastMarketingTime, marketingTotal, marketingAmountLeft, marketingAmountAvailableNow, marketingWlgold, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, userAmount, sLandDailyAmount, investFundTotal]
178186 }
187+
188+
189+func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
179190
180191
181192 func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
182193
183194
184195 func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
185196
186197
187198 func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
188199
189200
190201 func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
191202
192203
193204 func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
194205
195206
196207 func keyUserXP (addr) = ("userXP_" + addr)
197208
198209
199210 func keyUserLevel (addr) = ("userLevel_" + addr)
200211
201212
202213 func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
203214
204215
205216 func maxHealth (level) = (100 + level)
206217
207218
208219 let ARTPRESALE = "PRESALE"
209220
210221 let ARTONBOARD = "ONBOARD"
211222
212223 let NUMRES = 6
213224
214225 let DAILYRESBYPIECE = 3456000
215226
216227 let DAYMILLIS = 86400000
217228
218229 let WHMULTIPLIER = 10000000000
219230
220231 let RESOURCEPRICEMIN = 39637
221232
222233 let ESMAXPACKAGES = 3
223234
224235 let ESBUYCOEF = 4
225236
226237 let ESSELLCOEF = 10
227238
228239 let COEFF2MAT = 10000000
229240
230241 let productionMatrix = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0_", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0_", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0_", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0_001", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0_", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0_", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0_", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0_111", "18_18_10_18_18_18_11_4_30_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_22_4_50_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_33_4_70_0,0,0,0,0,0,0_201"]
231242
232243 let rIdxCoeff = 6
233244
234245 let PRODUCTPKGSIZE = 10
235246
236247 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
237248
238249
239250 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
240251
241252
242253 func keyLandAssetIdToCustomName (assetId) = ("landCustomNameByAssetId_" + assetId)
243254
244255
245256 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
246257
247258
248259 func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
249260
250261
251262 func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["landArtStatus", type, assetId], "_")
252263
253264
254265 func keyWarehouseByLand (landAssetId) = ("wareHouse_" + landAssetId)
255266
256267
257268 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
258269
259270
260271 func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
261272
262273
263274 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
264275
265276
266277 func keyOnboardArtDuckActivatedBy (addr) = ("onboardArtActivatedDuckBy_" + addr)
267278
268279
269280 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
270281
271282
272283 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
273284
274285
275286 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
276287
277288
278289 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
279290
280291
281-func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
282-
283-
284292 func keyBlocked () = "contractsBlocked"
285293
286294
287295 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
288296
289297
290298 func keyEsWarehouse () = "emergencyWarehouseProducts"
291299
292300
293301 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
294302
295303
296304 let chain = take(drop(this.bytes, 1), 1)
297305
298306 let usdtAssetId = match chain {
299307 case _ =>
300308 if ((base58'2W' == $match0))
301309 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
302310 else if ((base58'2T' == $match0))
303311 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
304312 else throw("Unknown chain")
305313 }
306314
307315 let defaultRestAddressStr = match chain {
308316 case _ =>
309317 if ((base58'2W' == $match0))
310318 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
311319 else if ((base58'2T' == $match0))
312320 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
313321 else throw("Unknown chain")
314322 }
315323
316324 let InfraUpgradeCostS = match chain {
317325 case _ =>
318326 if ((base58'2W' == $match0))
319327 then 10000000000
320328 else if ((base58'2T' == $match0))
321329 then 100000000
322330 else throw("Unknown chain")
323331 }
324332
325333 let SEP = "__"
326334
327335 let MULT6 = 1000000
328336
329337 let SSIZE = 25
330338
331339 let MSIZE = 100
332340
333341 let LSIZE = 225
334342
335343 let XLSIZE = 400
336344
337345 let XXLSIZE = 625
338346
339347 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
340348
341349
342350 let IdxCfgStakingDapp = 1
343351
344352 let IdxCfgEconomyDapp = 2
345353
346354 let IdxCfgGovernanceDapp = 3
347355
348356 let IdxCfgWlgDapp = 4
349357
350358 let IdxCfgPuzzlePoolDapp = 5
351359
360+let IdxCfgInvestFundDapp = 6
361+
352362 func keyRestCfg () = "%s__restConfig"
353363
354364
355365 func keyRestAddress () = "%s__restAddr"
356366
357367
358368 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
359369
360370
361371 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
362372
363373
364374 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
365375
366376 let restCfg = readRestCfgOrFail(restContract)
367377
368378 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
369379
370380 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
371381
372382 let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
373383
374384 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
375385
376386 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
387+
388+let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
377389
378390 let recLandNum = 0
379391
380392 let recLandSize = 1
381393
382394 let recTerrains = 2
383395
384396 let recContinent = 3
385397
386398 let wlgAssetIdKey = "wlg_assetId"
387399
388400 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "Not initialized yet")
389401
390402 let IdxEffUser = 1
391403
392404 func keyResProportions () = "resTypesProportions"
393405
394406
395407 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
396408
397409
398410 func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
399411
400412
401413 func asString (v) = match v {
402414 case s: String =>
403415 s
404416 case _ =>
405417 throw("fail to cast into String")
406418 }
407419
408420
409421 func asInt (v) = match v {
410422 case n: Int =>
411423 n
412424 case _ =>
413425 throw("fail to cast into Int")
414426 }
415427
416428
417429 func asBoolean (v) = match v {
418430 case s: Boolean =>
419431 s
420432 case _ =>
421433 throw("fail to cast into Boolean")
422434 }
423435
424436
425437 func numPiecesBySize (landSize) = match landSize {
426438 case _ =>
427439 if (("S" == $match0))
428440 then SSIZE
429441 else if (("M" == $match0))
430442 then MSIZE
431443 else if (("L" == $match0))
432444 then LSIZE
433445 else if (("XL" == $match0))
434446 then XLSIZE
435447 else if (("XXL" == $match0))
436448 then XXLSIZE
437449 else throw("Unknown land size")
438450 }
439451
440452
441453 func getVotingPower (userAddrStrOrEmpty) = {
442454 let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
443455 func adder (acc,item) = (acc + parseIntValue(item))
444456
445457 let totalPower = {
446458 let $l = props
447459 let $s = size($l)
448460 let $acc0 = 0
449461 func $f0_1 ($a,$i) = if (($i >= $s))
450462 then $a
451463 else adder($a, $l[$i])
452464
453465 func $f0_2 ($a,$i) = if (($i >= $s))
454466 then $a
455467 else throw("List size exceeds 6")
456468
457469 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
458470 }
459471 let usersPower = valueOrElse(getInteger(stakingContract, keyStakedPiecesByOwner(userAddrStrOrEmpty)), 0)
460472 [totalPower, usersPower]
461473 }
462474
463475
464476 let USDTPRIZEPART = 500000
465477
466478 func asListIntCompacted (val) = match val {
467479 case valAnyList: List[Any] =>
468480 if ((size(valAnyList) != NUMRES))
469481 then throw(("Array size is " + toString(size(valAnyList))))
470482 else {
471483 func conv (acc,item) = match item {
472484 case it: Int =>
473485 (acc :+ toString(it))
474486 case _ =>
475487 throw("List type is not Int")
476488 }
477489
478490 let r = {
479491 let $l = valAnyList
480492 let $s = size($l)
481493 let $acc0 = nil
482494 func $f0_1 ($a,$i) = if (($i >= $s))
483495 then $a
484496 else conv($a, $l[$i])
485497
486498 func $f0_2 ($a,$i) = if (($i >= $s))
487499 then $a
488500 else throw("List size exceeds 6")
489501
490502 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
491503 }
492504 makeString(r, "_")
493505 }
494506 case _ =>
495507 throw("fail to cast into List")
496508 }
497509
498510
499511 func asSplitResult (val) = match val {
500512 case t2: (List[Any], List[Any]) =>
501513 $Tuple2(asListIntCompacted(t2._1), asListIntCompacted(t2._2))
502514 case _ =>
503515 throw("fail to cast into (List, List)")
504516 }
505517
506518
507519 func walletInternal (userAddressOpt) = {
508520 let addr = addressFromString(userAddressOpt)
509521 let balance = if (isDefined(addr))
510522 then wavesBalance(value(addr))
511523 else BalanceDetails(0, 0, 0, 0)
512524 let usdtBalance = if (isDefined(addr))
513525 then assetBalance(value(addr), usdtAssetId)
514526 else 0
515527 let wlgoldBalance = if (isDefined(addr))
516528 then assetBalance(value(addr), wlgAssetId)
517529 else 0
518530 let customName = valueOrElse(getString(stakingContract, keyAddressToCustomName(userAddressOpt)), userAddressOpt)
519531 let refByKey = keyAddressRefBy(userAddressOpt)
520532 let refBy = getString(stakingContract, refByKey)
521533 let refs = valueOrElse(getString(stakingContract, keyAddressReferrals(userAddressOpt)), "")
522534 let lastTxId = valueOrElse(getString(stakingContract, keyLastTxIdByUser(userAddressOpt)), "")
523535 let pieces = getVotingPower(userAddressOpt)[IdxEffUser]
524536 let xp = valueOrElse(getInteger(stakingContract, keyUserXP(userAddressOpt)), 0)
525537 let lvl = valueOrElse(getInteger(stakingContract, keyUserLevel(userAddressOpt)), 0)
526538 let freePoints = valueOrElse(getInteger(stakingContract, keyUserFreePoints(userAddressOpt)), 0)
527539 let onboard = if (isDefined(refBy))
528540 then (ARTONBOARD + (if (if (isDefined(addr))
529541 then isDefined(getString(stakingContract, keyOnboardArtDuckActivatedBy(userAddressOpt)))
530542 else false)
531543 then ":1"
532544 else ":0"))
533545 else ""
534546 [("%s%s__customName__" + customName), ("%s%s__referredBy__" + valueOrElse(refBy, "")), ("%s%s__referrals__" + refs), ("%s%s__lastTxId__" + lastTxId), ("%s%d__wavesBalance__" + toString(balance.available)), ("%s%d__wlgoldBalance__" + toString(wlgoldBalance)), ("%s%d__usdtBalance__" + toString(usdtBalance)), ("%s%d__stakedPieces__" + toString(pieces)), ("%s%d__currentXp__" + toString(xp)), ("%s%d__currentLvl__" + toString(lvl)), ("%s%d__pointsToDistribute__" + toString(freePoints)), ("%s%s__walletArtefacts__" + onboard)]
535547 }
536548
537549
538550 func applyBonuses (landAssetId,pieces) = {
539551 let infraLevel = valueOrElse(getInteger(stakingContract, keyInfraLevelByAssetId(landAssetId)), 0)
540552 let artPieces = valueOrElse(getInteger(stakingContract, keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
541553 let add6 = (infraLevel / 6)
542554 let add7 = (infraLevel / 7)
543555 $Tuple3(infraLevel, artPieces, ((DAILYRESBYPIECE + fraction(DAILYRESBYPIECE, ((infraLevel + add6) + (2 * add7)), 5)) + fraction(DAILYRESBYPIECE, artPieces, (pieces * 5))))
544556 }
545557
546558
547559 func getWarehouseTotalVolume (volPrefix) = {
548560 let parts = split(volPrefix, "_")
549561 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
550562 }
551563
552564
553565 func getWarehouse (whKey,landIndex,infraLevel) = {
554566 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
555567 let totS = toString(getWarehouseTotalVolume(volPrefix))
556568 let whStr = valueOrElse(getString(stakingContract, whKey), ((((volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0_0_") + totS) + "_") + totS))
557569 split(whStr, ":")
558570 }
559571
560572
561573 func duckInfoTuple (duckAssetId) = $Tuple5(valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(duckAssetId)), -1), value(assetInfo(fromBase58String(duckAssetId))).name, valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), ""), valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), -1), asString(invoke(stakingContract, "getBackpackREADONLY", [duckAssetId], nil)))
562574
563575
564576 func duckInfoArray (duckAssetId,owner,duckInf) = {
565577 let customName = valueOrElse(getString(stakingContract, keyDuckAssetIdToCustomName(duckAssetId)), duckInf._2)
566578 let chars = valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0")
567579 let xp = valueOrElse(getInteger(stakingContract, keyDuckXP(duckAssetId)), 0)
568580 let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
569581 let freePoints = valueOrElse(getInteger(stakingContract, keyDuckFreePoints(duckAssetId)), 0)
570582 let equipm = valueOrElse(getString(stakingContract, keyDuckEquipment(duckAssetId)), ";_;_;_;_;_;")
571583 [("%s%s__assetId__" + duckAssetId), ("%s%s__owner__" + owner), ("%s%s__customName__" + customName), ("%s%d__stakedTime__" + toString(duckInf._1)), ("%s%s__name__" + duckInf._2), ("%s%s__location__" + duckInf._3), ("%s%d__health__" + toString(duckInf._4)), ("%s%d__maxHealth__" + toString(maxHealth(lvl))), ("%s%s__characteristics__" + chars), ("%s%d__currentXp__" + toString(xp)), ("%s%d__currentLvl__" + toString(lvl)), ("%s%d__pointsToDistribute__" + toString(freePoints)), ("%s%s__backPack__" + duckInf._5), ("%s%s__equipment__" + equipm)]
572584 }
573585
574586
575587 func landInfoArray (landAssetId,owner,stakedTime) = if ((landAssetId == ""))
576588 then throw("landAssetId is required")
577589 else {
578590 let a = value(assetInfo(fromBase58String(landAssetId)))
579591 let d = split(a.description, "_")
580592 let landNum = if ((a.quantity > 0))
581593 then d[recLandNum]
582594 else ("-" + d[recLandNum])
583595 let pieces = numPiecesBySize(d[recLandSize])
584596 let productivity = applyBonuses(landAssetId, pieces)
585597 let deltaTime = (lastBlock.timestamp - stakedTime)
586598 let availRes = if ((stakedTime > 0))
587599 then fraction(deltaTime, (productivity._3 * pieces), DAYMILLIS)
588600 else 0
589601 let needMat = fraction(InfraUpgradeCostS, (pieces * (productivity._1 + 1)), SSIZE)
590602 let globalAndLocal = if ((stakedTime > 0))
591603 then asSplitResult(invoke(stakingContract, "splitByGlobalAndLocalWeightsREADONLY", [needMat, availRes, d[recTerrains]], nil))
592604 else $Tuple2(asListIntCompacted(invoke(stakingContract, "splitByGlobalWeightsREADONLY", [needMat], nil)), "")
593605 let customName = valueOrElse(getString(stakingContract, keyLandAssetIdToCustomName(landAssetId)), ((d[recContinent] + "-") + d[recLandNum]))
594606 [("%s%s__assetId__" + landAssetId), ("%s%s__owner__" + owner), ("%s%s__customName__" + customName), ("%s%d__stakedTime__" + toString(stakedTime)), ("%s%s__description__" + makeString([landNum, d[recLandSize], d[recTerrains], d[recContinent]], "_")), ("%s%d__infraLevel__" + toString(productivity._1)), ("%s%s__availResByType__" + globalAndLocal._2), ("%s%d__availResTotal__" + toString(availRes)), ("%s%s__needMaterial__" + globalAndLocal._1), ("%s%s__landArtefacts__PRESALE:" + toString(productivity._2)), ("%s%s__warehouse__" + makeString(getWarehouse(keyWarehouseByLand(landAssetId), (pieces / SSIZE), productivity._1), ":")), ("%s%s__landOrder__" + valueOrElse(getString(economyContract, keyOrderByLand(landAssetId)), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"))]
595607 }
596608
597609
598610 func landOrderInfoArray (landAssetId,owner) = if ((landAssetId == ""))
599611 then throw("landAssetId is required")
600612 else {
601613 let a = value(assetInfo(fromBase58String(landAssetId)))
602614 let d = split(a.description, "_")
603615 let pieces = numPiecesBySize(d[recLandSize])
604616 let productivity = applyBonuses(landAssetId, pieces)
605617 [("%s%s__assetId__" + landAssetId), ("%s%s__owner__" + owner), ("%s%s__warehouse__" + makeString(getWarehouse(keyWarehouseByLand(landAssetId), (pieces / SSIZE), productivity._1), ":")), ("%s%s__landOrder__" + valueOrElse(getString(economyContract, keyOrderByLand(landAssetId)), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"))]
606618 }
607619
608620
609621 @Callable(i)
610622 func constructorV1 (contracts) = if ((i.caller != this))
611623 then throw("permissions denied")
612624 else {
613625 func descriptor (acc,ignoredItem) = (acc + "%s")
614626
615627 let descr = {
616628 let $l = contracts
617629 let $s = size($l)
618630 let $acc0 = ""
619631 func $f0_1 ($a,$i) = if (($i >= $s))
620632 then $a
621633 else descriptor($a, $l[$i])
622634
623635 func $f0_2 ($a,$i) = if (($i >= $s))
624636 then $a
625637 else throw("List size exceeds 10")
626638
627639 $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)
628640 }
629641 [StringEntry(keyRestCfg(), makeString(descr :: contracts, SEP)), StringEntry(keyRestAddress(), toString(this))]
630642 }
631643
632644
633645
634646 @Callable(i)
635647 func walletInfoREADONLY (userAddressOpt) = $Tuple2(nil, walletInternal(userAddressOpt))
636648
637649
638650
639651 @Callable(i)
640652 func duckByOwnerInfoREADONLY (userAddress) = {
641653 let stakedDuck = getString(stakingContract, keyStakedDuckByOwner(userAddress))
642654 $Tuple2(nil, if (if (isDefined(addressFromString(userAddress)))
643655 then isDefined(stakedDuck)
644656 else false)
645657 then {
646658 let duckAssetId = value(stakedDuck)
647659 duckInfoArray(duckAssetId, userAddress, duckInfoTuple(duckAssetId))
648660 }
649661 else duckInfoArray("", userAddress, $Tuple5(-1, "", "", -1, "")))
650662 }
651663
652664
653665
654666 @Callable(i)
655667 func duckByAssetIdInfoREADONLY (duckAssetId) = {
656668 let owner = getString(stakingContract, keyDuckIdToOwner(duckAssetId))
657669 let duckInf = duckInfoTuple(duckAssetId)
658670 $Tuple2(nil, duckInfoArray(duckAssetId, if (isDefined(owner))
659671 then value(owner)
660672 else "", duckInfoTuple(duckAssetId)))
661673 }
662674
663675
664676
665677 @Callable(i)
666678 func landByAssetIdInfoREADONLY (landAssetId) = if ((landAssetId == ""))
667679 then throw("landAssetId is required")
668680 else {
669681 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
670682 let owner = if ((stakedTime > 0))
671683 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
672684 else ""
673685 $Tuple2(nil, landInfoArray(landAssetId, owner, stakedTime))
674686 }
675687
676688
677689
678690 @Callable(i)
679691 func stakedLandsByOwnerInfoREADONLY (landOwnerAddress) = if ((landOwnerAddress == ""))
680692 then throw("landOwnerAddress is required")
681693 else {
682694 let landsStr = getString(stakingContract, keyStakedLandsByOwner(landOwnerAddress))
683695 let lands = if (isDefined(landsStr))
684696 then split_51C(value(landsStr), "_")
685697 else nil
686698 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
687699 then throw("landAssetId is required")
688700 else {
689701 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
690702 (acc :+ landInfoArray(landAssetId, landOwnerAddress, stakedTime))
691703 }
692704
693705 let r = {
694706 let $l = lands
695707 let $s = size($l)
696708 let $acc0 = nil
697709 func $f0_1 ($a,$i) = if (($i >= $s))
698710 then $a
699711 else oneLand($a, $l[$i])
700712
701713 func $f0_2 ($a,$i) = if (($i >= $s))
702714 then $a
703715 else throw("List size exceeds 100")
704716
705717 $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($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), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
706718 }
707719 $Tuple2(nil, r)
708720 }
709721
710722
711723
712724 @Callable(i)
713725 func landsByIdsInfoREADONLY (landAssetIds) = {
714726 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
715727 then throw("landAssetId is required")
716728 else {
717729 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
718730 let owner = if ((stakedTime > 0))
719731 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
720732 else ""
721733 (acc :+ landInfoArray(landAssetId, owner, stakedTime))
722734 }
723735
724736 let r = {
725737 let $l = landAssetIds
726738 let $s = size($l)
727739 let $acc0 = nil
728740 func $f0_1 ($a,$i) = if (($i >= $s))
729741 then $a
730742 else oneLand($a, $l[$i])
731743
732744 func $f0_2 ($a,$i) = if (($i >= $s))
733745 then $a
734746 else throw("List size exceeds 100")
735747
736748 $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($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), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
737749 }
738750 $Tuple2(nil, r)
739751 }
740752
741753
742754
743755 @Callable(i)
744756 func warehouseOrderByAssetIdInfoREADONLY (landAssetId) = if ((landAssetId == ""))
745757 then throw("landAssetId is required")
746758 else {
747759 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
748760 let owner = if ((stakedTime > 0))
749761 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
750762 else ""
751763 $Tuple2(nil, landOrderInfoArray(landAssetId, owner))
752764 }
753765
754766
755767
756768 @Callable(i)
757769 func ordersByLandIdsInfoREADONLY (landAssetIds) = {
758770 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
759771 then throw("landAssetId is required")
760772 else {
761773 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
762774 let owner = if ((stakedTime > 0))
763775 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
764776 else ""
765777 (acc :+ landOrderInfoArray(landAssetId, owner))
766778 }
767779
768780 let r = {
769781 let $l = landAssetIds
770782 let $s = size($l)
771783 let $acc0 = nil
772784 func $f0_1 ($a,$i) = if (($i >= $s))
773785 then $a
774786 else oneLand($a, $l[$i])
775787
776788 func $f0_2 ($a,$i) = if (($i >= $s))
777789 then $a
778790 else throw("List size exceeds 40")
779791
780792 $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($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)
781793 }
782794 $Tuple2(nil, r)
783795 }
784796
785797
786798
787799 @Callable(i)
788800 func cancelWarehouseOrders (landAssetIds) = if ((i.caller != this))
789801 then throw("permission denied")
790802 else {
791803 let blocked = getBoolean(stakingContract, keyBlocked())
792804 if (if (!(isDefined(blocked)))
793805 then true
794806 else (value(blocked) == false))
795807 then throw("Contracts should be blocked before canceling orders")
796808 else {
797809 func oneLand (a,landAssetId) = if ((landAssetId == ""))
798810 then throw("landAssetId is required")
799811 else {
800812 let c = asBoolean(invoke(economyContract, "setWarehouseOrder", ["0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:", landAssetId], nil))
801813 if (if (a)
802814 then true
803815 else c)
804816 then !(if (a)
805817 then c
806818 else false)
807819 else false
808820 }
809821
810822 let r = {
811823 let $l = landAssetIds
812824 let $s = size($l)
813825 let $acc0 = false
814826 func $f0_1 ($a,$i) = if (($i >= $s))
815827 then $a
816828 else oneLand($a, $l[$i])
817829
818830 func $f0_2 ($a,$i) = if (($i >= $s))
819831 then $a
820832 else throw("List size exceeds 30")
821833
822834 $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($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)
823835 }
824836 $Tuple2(nil, r)
825837 }
826838 }
827839
828840
829841
830842 @Callable(i)
831843 func fixWarehouseFormats (landAssetIds) = if ((i.caller != this))
832844 then throw("permission denied")
833845 else {
834846 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
835847 then throw("landAssetId is required")
836848 else (acc + size(asString(invoke(stakingContract, "fixWarehouseFormat", [landAssetId], nil))))
837849
838850 let r = {
839851 let $l = landAssetIds
840852 let $s = size($l)
841853 let $acc0 = 0
842854 func $f0_1 ($a,$i) = if (($i >= $s))
843855 then $a
844856 else oneLand($a, $l[$i])
845857
846858 func $f0_2 ($a,$i) = if (($i >= $s))
847859 then $a
848860 else throw("List size exceeds 25")
849861
850862 $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($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)
851863 }
852864 $Tuple2(nil, r)
853865 }
854866
855867
856868
857869 @Callable(i)
858870 func fixStakedPieces (users) = if ((i.caller != this))
859871 then throw("permission denied")
860872 else {
861873 func oneUser (acc,addr) = if ((addr == ""))
862874 then throw("address is required")
863875 else (acc + asInt(invoke(stakingContract, "fixStakedPieces", [addr], nil)))
864876
865877 let r = {
866878 let $l = users
867879 let $s = size($l)
868880 let $acc0 = 0
869881 func $f0_1 ($a,$i) = if (($i >= $s))
870882 then $a
871883 else oneUser($a, $l[$i])
872884
873885 func $f0_2 ($a,$i) = if (($i >= $s))
874886 then $a
875887 else throw("List size exceeds 16")
876888
877889 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
878890 }
879891 $Tuple2(nil, r)
880892 }
881893
882894
883895
884896 @Callable(i)
885897 func sendUsdtPrize (userAddress) = if ((i.caller != stakingContract))
886898 then throw("permission denied")
887899 else {
888900 let amt = fraction(assetBalance(this, usdtAssetId), USDTPRIZEPART, MULT6)
889901 $Tuple2([ScriptTransfer(addressFromStringValue(userAddress), amt, usdtAssetId)], amt)
890902 }
891903
892904
893905
894906 @Callable(i)
895907 func getEmergencyServiceDataREADONLY () = {
896908 let existStr = getString(economyContract, keyEsWarehouse())
897909 let existAmounts = if (isDefined(existStr))
898910 then split(value(existStr), "_")
899911 else nil
900912 func singleProd (acc,recipeStr) = {
901913 let n = acc._2
902914 let recipe = split(recipeStr, "_")
903915 let maxAmount = if ((n == 0))
904916 then (ESMAXPACKAGES * PRODUCTPKGSIZE)
905917 else 0
906918 let existAmount = if ((size(existAmounts) > n))
907919 then parseIntValue(existAmounts[n])
908920 else 0
909921 let totalMat = getRecipeMaterials(recipe)
910922 let buyPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (10 * PRODUCTPKGSIZE))
911923 let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (10 * PRODUCTPKGSIZE))
912924 let y = makeString([toString(maxAmount), toString(existAmount), toString(buyPrice), toString(sellPrice)], "_")
913925 $Tuple2((acc._1 :+ y), (n + 1))
914926 }
915927
916928 let s = makeString_2C(( let $l = productionMatrix
917929 let $s = size($l)
918930 let $acc0 = $Tuple2(nil, 0)
919931 func $f0_1 ($a,$i) = if (($i >= $s))
920932 then $a
921933 else singleProd($a, $l[$i])
922934
923935 func $f0_2 ($a,$i) = if (($i >= $s))
924936 then $a
925937 else throw("List size exceeds 50")
926938
927939 $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, ":")
928940 let result = ("%s%s__emergencyServiceData__" + s)
929941 $Tuple2(nil, result)
930942 }
931943
932944
933945
934946 @Callable(i)
935947 func wlgStatsREADONLY (userAddrOpt) = {
936948 let curStats = getWlgStats(userAddrOpt, [restContract, stakingContract, economyContract, govContract, wlgContract, puzzlePoolContract], usdtAssetId, 0)
937- $Tuple2(nil, [("%s%s%d__wlgAmount__" + toString(curStats[idxWlgAmount])), ("%s%s%d__wlgPrice__" + toString(curStats[idxWlgPrice])), ("%s%s%d__usdtFunds__" + toString(curStats[idxWlgFunds])), ("%s%s%d__usdtEconomy__" + toString(curStats[idxWlgEconomy])), ("%s%s%d__usdtActivity__" + toString(curStats[idxWlgActivity])), ("%s%s%d__usdtArbitrage__" + toString(curStats[idxWlgArbitrage])), ("%s%s%d__usdtPool__" + toString(curStats[idxWlgPool])), ("%s%s%d__wlgIssueTime__" + toString(curStats[idxWlgIssueTime])), ("%s%s%d__wlgLastMarketingTeamActTime__" + toString(curStats[idxWlgLastMTATime])), ("%s%s%d__wlgMarketingTotal__" + toString(curStats[idxWlgMarketingTotal])), ("%s%s%d__wlgMarketingAmLeft__" + toString(curStats[idxWlgMarketingAmLeft])), ("%s%s%d__wlgMarketingAmAvailNow__" + toString(curStats[idxWlgMarketingAmAvailNow])), ("%s%s%d__wlgMarketingWlgold__" + toString(curStats[idxWlgMarketingWlgold])), ("%s%s%d__wlgTeamTotal__" + toString(curStats[idxWlgTeamTotal])), ("%s%s%d__wlgTeamAmLeft__" + toString(curStats[idxWlgTeamAmLeft])), ("%s%s%d__wlgTeamAmAvailNow__" + toString(curStats[idxWlgTeamAmAvailNow])), ("%s%s%d__wlgTeamWlgold__" + toString(curStats[idxWlgTeamWlgold])), ("%s%s%d__wlgActTotal__" + toString(curStats[idxWlgActTotal])), ("%s%s%d__wlgActAmLeft__" + toString(curStats[idxWlgActAmLeft])), ("%s%s%d__wlgActAmAvailNow__" + toString(curStats[idxWlgActAmAvailNow])), ("%s%s%d__wlgActWlgold__" + toString(curStats[idxWlgActWlgold])), ("%s%s%d__wlgCurPeriod__" + toString(curStats[idxWlgCurPeriod])), ("%s%s%d__wlgAmLeftTotal__" + toString(curStats[idxWlgAmLeftTotal])), ("%s%s%d__wlgCurPeriodDistribution__" + toString(curStats[idxWlgCurPeriodDistribution])), ("%s%s%d__wlgLastUserTime__" + toString(curStats[idxWlgLastUserTime])), ("%s%s%d__wlgUserAmAvailNow__" + toString(curStats[idxWlgUserAmAvailNow])), ("%s%s%d__wlgGuestSLandDaily__" + toString(curStats[idxWlgSLandDailyAmount]))])
949+ $Tuple2(nil, [("%s%s%d__wlgAmount__" + toString(curStats[idxWlgAmount])), ("%s%s%d__wlgPrice__" + toString(curStats[idxWlgPrice])), ("%s%s%d__usdtFunds__" + toString(curStats[idxWlgFunds])), ("%s%s%d__usdtEconomy__" + toString(curStats[idxWlgEconomy])), ("%s%s%d__usdtActivity__" + toString(curStats[idxWlgActivity])), ("%s%s%d__usdtArbitrage__" + toString(curStats[idxWlgArbitrage])), ("%s%s%d__usdtPool__" + toString(curStats[idxWlgPool])), ("%s%s%d__wlgIssueTime__" + toString(curStats[idxWlgIssueTime])), ("%s%s%d__wlgLastMarketingTeamActTime__" + toString(curStats[idxWlgLastMTATime])), ("%s%s%d__wlgMarketingTotal__" + toString(curStats[idxWlgMarketingTotal])), ("%s%s%d__wlgMarketingAmLeft__" + toString(curStats[idxWlgMarketingAmLeft])), ("%s%s%d__wlgMarketingAmAvailNow__" + toString(curStats[idxWlgMarketingAmAvailNow])), ("%s%s%d__wlgMarketingWlgold__" + toString(curStats[idxWlgMarketingWlgold])), ("%s%s%d__wlgTeamTotal__" + toString(curStats[idxWlgTeamTotal])), ("%s%s%d__wlgTeamAmLeft__" + toString(curStats[idxWlgTeamAmLeft])), ("%s%s%d__wlgTeamAmAvailNow__" + toString(curStats[idxWlgTeamAmAvailNow])), ("%s%s%d__wlgTeamWlgold__" + toString(curStats[idxWlgTeamWlgold])), ("%s%s%d__wlgActTotal__" + toString(curStats[idxWlgActTotal])), ("%s%s%d__wlgActAmLeft__" + toString(curStats[idxWlgActAmLeft])), ("%s%s%d__wlgActAmAvailNow__" + toString(curStats[idxWlgActAmAvailNow])), ("%s%s%d__wlgActWlgold__" + toString(curStats[idxWlgActWlgold])), ("%s%s%d__wlgCurPeriod__" + toString(curStats[idxWlgCurPeriod])), ("%s%s%d__wlgAmLeftTotal__" + toString(curStats[idxWlgAmLeftTotal])), ("%s%s%d__wlgCurPeriodDistribution__" + toString(curStats[idxWlgCurPeriodDistribution])), ("%s%s%d__wlgLastUserTime__" + toString(curStats[idxWlgLastUserTime])), ("%s%s%d__wlgUserAmAvailNow__" + toString(curStats[idxWlgUserAmAvailNow])), ("%s%s%d__wlgGuestSLandDaily__" + toString(curStats[idxWlgSLandDailyAmount])), ("%s%s%d__wlgInvestFundTotal__" + toString(curStats[idxWlgInvestFundAmount]))])
938950 }
939951
940952

github/deemru/w8io/169f3d6 
150.40 ms