tx · F9paorUAK9Va7AvHqTHxhYen97Yukb2Jep8hv8ykKMqr

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.03600000 Waves

2024.12.20 07:25 [3422369] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "F9paorUAK9Va7AvHqTHxhYen97Yukb2Jep8hv8ykKMqr", "fee": 3600000, "feeAssetId": null, "timestamp": 1734668807601, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "4Pk3p1KuEKnSVMHG6J8qWtNJqqgtE24nRsdFPQvdq9u34SXE2Eqz1E9XEtGgu6cuXsaDHDagvMZDdJTa9U69MFt4" ], "script": "base64:BgJSCAISBgoECAgICBIDCgEIEgMKAQESBAoCCAESAwoBARIECgIIARIAEgMKAQgSAwoBCBIDCgEBEgMKAQESAwoBCBIDCgEIEgMKAQESABIECgIIAbsBAANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8ADk1JTlNIT1BQQVlNRU5UAKCNBgAKREFZX01JTExJUwCAuJkpAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQAKREFZX0JMT0NLUwQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMACgCwMJAAACAQFUBQckbWF0Y2gwADwJAAIBAg1Vbmtub3duIGNoYWluAAtXRUVLX0JMT0NLUwQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMADgTgMJAAACAQFUBQckbWF0Y2gwALQBCQACAQINVW5rbm93biBjaGFpbgAKVlJGX09GRlNFVAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAAAAwkAAAIBAVQFByRtYXRjaDAAkPlFCQACAQINVW5rbm93biBjaGFpbgALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgASZWNvbm9teUNvbnRyYWN0U3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUDJzazFLbmNTeFJhWnM4YjRDV0dQdzJqa3Z2YXY3NHU0RAMJAAACAQFUBQckbWF0Y2gwAiMzTjh5NHd4WDNKQzRUZHJDSkJYWDE2U2pXZjZYMjU2aHJlcAkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABBJZHhDZmdBY3JlczJEYXBwAAEADUlkeENmZ1dsZ0RhcHAAAgAUSWR4Q2ZnUHV6emxlUG9vbERhcHAABAAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABQAQSWR4Q2ZnTWFya2V0RGFwcAAGAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyAAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIIcmVzdDJDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQhyZXN0MkNmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAEUlkeENmZ1N0YWtpbmdEYXBwAAEAD0lkeENmZ0FjcmVzRGFwcAAIAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwAA1hY3Jlc0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUPSWR4Q2ZnQWNyZXNEYXBwAA1yZXN0MkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9rZXlSZXN0MkFkZHJlc3MABRZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyAAhyZXN0MkNmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUNcmVzdDJDb250cmFjdAAOYWNyZXMyQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUQSWR4Q2ZnQWNyZXMyRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUNSWR4Q2ZnV2xnRGFwcAAScHV6emxlUG9vbENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFFElkeENmZ1B1enpsZVBvb2xEYXBwABJpbnZlc3RGdW5kQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUUSWR4Q2ZnSW52ZXN0RnVuZERhcHAADm1hcmtldENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ01hcmtldERhcHABFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhNsYXN0V2Vla1R4SWRCeVVzZXJfBQRhZGRyAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQBCmtleVVzZXJCZXQBBGFkZHIJAKwCAgIIdXNlckJldF8FBGFkZHIBEmtleVVzZXJXZWVrVGlja2V0cwIEYWRkcgR3ZWVrCQCsAgIJAKwCAgkArAICAhB1c2VyV2Vla1RpY2tldHNfBQRhZGRyAgFfCQCkAwEFBHdlZWsBE2tleVRvdGFsV2Vla1RpY2tldHMBBHdlZWsJAKwCAgIRdG90YWxXZWVrVGlja2V0c18JAKQDAQUEd2VlawEYa2V5VG90YWxXZWVrUGFydGljaXBhbnRzAQR3ZWVrCQCsAgICFnRvdGFsV2Vla1BhcnRpY2lwYW50c18JAKQDAQUEd2VlawEOa2V5TnVtTkZUMkRyYXcBBHdlZWsJAKwCAgIMbnVtTkZUMkRyYXdfCQCkAwEFBHdlZWsBDmtleU51bU5GVERyYXduAQR3ZWVrCQCsAgICDG51bU5GVERyYXduXwkApAMBBQR3ZWVrAQ5rZXlXZWVrV2lubmVycwEEd2VlawkArAICAgx3ZWVrV2lubmVyc18JAKQDAQUEd2VlawEKd2lubmluZ0JldAEDZGF5BAFiCQBoAgUDZGF5BQpEQVlfQkxPQ0tTBAFoAwkAZgIFAWIFClZSRl9PRkZTRVQFAWIJAGQCBQFiBQpWUkZfT0ZGU0VUCQBqAgkAsQkBCQEFdmFsdWUBCAkBBXZhbHVlAQkA7QcBBQFoA3ZyZgAEAAtpeFdsZ0Ftb3VudAAAAAhpeFdsZ1dsZwABAAppeFdsZ1ByaWNlAAIADml4V2xnSXNzdWVUaW1lAAgAD2l4V2xnVGVhbUFtTGVmdAALABNpeFdsZ1RlYW1BbUF2YWlsTm93AAwADml4V2xnQWN0QW1MZWZ0AA8AEml4V2xnQWN0QW1BdmFpbE5vdwAQABBpeFdsZ0FtTGVmdFRvdGFsABMAE2l4V2xnVXNlckFtQXZhaWxOb3cAFwAQaXhXbGdFZmZVc2VyVGltZQAYABJpeFdsZ0lzc3VlMTBBbW91bnQAGQAbaXhXbGdNYXJrZXRpbmdJc3N1ZTEwQW1vdW50ABoAFml4V2xnVGVhbUlzc3VlMTBBbW91bnQAGwAPaXhXbGdVc2VyMTBwYXJ0ABwAEGl4V2xnSXNzdWUxMFRpbWUAHQEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAEPZ2V0UmFuZG9tTnVtYmVyAwhtYXhWYWx1ZQRzYWx0B2VudHJvcHkDCQBnAgAABQhtYXhWYWx1ZQkAAgECFm1heFZhbHVlIHNob3VsZCBiZSA+IDAECnJhbmRvbUhhc2gJANQWAQkAywECBQRzYWx0BQdlbnRyb3B5CQBqAgkAsQkBBQpyYW5kb21IYXNoBQhtYXhWYWx1ZQACTTQAkE4ABlNDQUxFOACAwtcvAAx4cExldmVsU2NhbGUAgBkAD3hwTGV2ZWxSZWNpcFBvdwCgHwASbnVtUG9pbnRzT25MZXZlbFVwAAMAD3dsZ0Jhc2VBbW91bnRYcACA0NvD9AIBCWtleVVzZXJYUAEEYWRkcgkArAICAgd1c2VyWFBfBQRhZGRyAQxrZXlVc2VyTGV2ZWwBBGFkZHIJAKwCAgIKdXNlckxldmVsXwUEYWRkcgAFeHBXbGcAkE4BCWxldmVsQnlYUAECeHAJAGsDBQx4cExldmVsU2NhbGUJAGwGBQJ4cAAEBQ94cExldmVsUmVjaXBQb3cABAAEBQRET1dOBQZTQ0FMRTgBB2xldmVsVXACCWN1cnJMZXZlbAVuZXdYUAQIbmV3TGV2ZWwJAQlsZXZlbEJ5WFABBQVuZXdYUAkAzAgCBQhuZXdMZXZlbAkAzAgCCQBoAgUSbnVtUG9pbnRzT25MZXZlbFVwCQBlAgUIbmV3TGV2ZWwFCWN1cnJMZXZlbAUDbmlsAQVpc1dpbgQLdXNlclRpY2tldHMMdG90YWxUaWNrZXRzCW51bVByaXplcwdyYW5kb200BAJhNAkAawMFAk00CQBlAgUMdG90YWxUaWNrZXRzBQt1c2VyVGlja2V0cwUMdG90YWxUaWNrZXRzBAJwNAkAbAYFAmE0AAQFCW51bVByaXplcwAAAAQFBERPV04JAGYCCQBlAgUCTTQFB3JhbmRvbTQFAnA0AAJNNgDAhD0AAk04AIDC1y8ACE1JTExJT042AICA6YOx3hYACVRFQU1TSEFSRQDAmgwADUFDVElWSVRZU0hBUkUAoI0GAAtQTEFZRVJTSEFSRQCAtRgACllFQVJNSUxMSVMAgIbrx3UACURBWU1JTExJUwCAuJkpAAhCQU5LX0ZFRQDQhgMAAmNoCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABABNVU0RUX1RWTF9DT1JSRUNUSU9OBAckbWF0Y2gwBQJjaAMJAAACAQFXBQckbWF0Y2gwAPD1qMAEAwkAAAIBAVQFByRtYXRjaDAAAAkAAgECDVVua25vd24gY2hhaW4AC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAPbGFzdFRlYW1UaW1lS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQARdGVhbUFtb3VudExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABVsYXN0QWN0aXZpdGllc1RpbWVLZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzABBhY3RBbW91bnRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAAUc3Rha2Vyc0Ftb3VudExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARtrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXJPbGQBBGFkZHIJAKwCAgIXbGFzdENsYWltZWRUaW1lVXNlck9sZF8FBGFkZHIBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBGFkZHIJAKwCAgIQbGFzdEFyYlRpbWVVc2VyXwUEYWRkcgEaa2V5TGFzdFdsZ1RyYWRlTGltaXRCeVVzZXIBBGFkZHIJAKwCAgIRbGFzdFdsZ0xpbWl0VXNlcl8FBGFkZHIBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQZwZXJpb2QJAGsDBQhNSUxMSU9ONgkAaAIFC1BMQVlFUlNIQVJFCQBkAgUGcGVyaW9kAAEJAGgCAAYFAk02AA93bGdJc3N1ZVRpbWVLZXkCDXdsZ19pc3N1ZVRpbWUAEndsZ0lzc3VlZEFtb3VudEtleQIQd2xnX2lzc3VlZEFtb3VudAARemJJc3N1ZWRBbW91bnRLZXkCEnpiaWxsX2lzc3VlZEFtb3VudAEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABNhY3Jlc1N0YWtlZFRvdGFsS2V5AhZhY3Jlc1N0YWtlZEFtb3VudFRvdGFsARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIWd2xnU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgARd2xnU3Rha2VkVG90YWxLZXkCFHdsZ1N0YWtlZEFtb3VudFRvdGFsARZrZXlXbGdTdGFrZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFHdsZ1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyAAhkYXBwUmVzdAAAAAtkYXBwU3Rha2luZwABAAtkYXBwRWNvbm9teQACAAdkYXBwV2xnAAMACmRhcHBQdXp6bGUABAAOZGFwcEludmVzdEZ1bmQABQAJZGFwcEFjcmVzAAYBCGdldExhbmRzAxJ1c2VyQWRkclN0ck9yRW1wdHkPc3Rha2luZ0NvbnRyYWN0DWFjcmVzQ29udHJhY3QEBXByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0AhNyZXNUeXBlc1Byb3BvcnRpb25zAgswXzBfMF8wXzBfMAIBXwoBBWFkZGVyAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAt0b3RhbFBpZWNlcwoAAiRsBQVwcm9wcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYECnVzZXJQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQCsAgICFHN0YWtlZFBpZWNlc0J5T3duZXJfBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAQKdG90YWxBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0BRNhY3Jlc1N0YWtlZFRvdGFsS2V5AAAECXVzZXJBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAkAzAgCBQt0b3RhbFBpZWNlcwkAzAgCBQp1c2VyUGllY2VzCQDMCAIFCnRvdGFsQWNyZXMJAMwIAgUJdXNlckFjcmVzBQNuaWwADmlkeFRvdGFsUGllY2VzAAAADWlkeFVzZXJQaWVjZXMAAQANaWR4VG90YWxBY3JlcwACAAxpZHhVc2VyQWNyZXMAAwART0xEX1NUQUtJTkdfREVBREwAgPnjm7kyAQtnZXRXbGdTdGF0cwULdXNlckFkZHJPcHQJY29udHJhY3RzBnVzZHRJZBV1c2R0QmFsYW5jZUNvcnJlY3Rpb24PdXNlclByb3BvcnRpb242BAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUSd2xnSXNzdWVkQW1vdW50S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQECmVjb25vbXlVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFC2RhcHBFY29ub215BQZ1c2R0SWQEB3Jlc3RVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHBSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFBnVzZHRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAlwdXp6bGVVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCmRhcHBQdXp6bGUFBnVzZHRJZAQRaW52ZXN0Rm5kQ29udHJhY3QJAJEDAgUJY29udHJhY3RzBQ5kYXBwSW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRFpbnZlc3RGbmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEWludmVzdEZuZENvbnRyYWN0BRF6Yklzc3VlZEFtb3VudEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCmVjb25vbXlVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBAV3bGdJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFD3dsZ0lzc3VlVGltZUtleQIPTm90IGluaXRpYWxpemVkBApiYW5rV2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwU3Rha2luZwUFd2xnSWQECXRlYW1Ub3RhbAkAawMFCE1JTExJT042BQlURUFNU0hBUkUFAk02BA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwURdGVhbUFtb3VudExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ9sYXN0VGVhbVRpbWVLZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFC3RlYW1BZGRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDnRlYW1BbW91bnRMZWZ0BQNuaWwECnRlYW1XbGdvbGQJAPAHAgUIdGVhbUFkZHIFBXdsZ0lkBAhhY3RUb3RhbAkAawMFCE1JTExJT042BQ1BQ1RJVklUWVNIQVJFBQJNNgQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUQYWN0QW1vdW50TGVmdEtleQUIYWN0VG90YWwEEmxhc3RBY3Rpdml0aWVzVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQlpc3N1ZVRpbWUEFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQhhY3RUb3RhbAkAZQIFA25vdwUSbGFzdEFjdGl2aXRpZXNUaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwUmVzdAUFd2xnSWQEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwkBG2tleUxhc3RDbGFpbWVkVGltZUJ5VXNlck9sZAEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQpZRUFSTUlMTElTBApub3dMaW1pdGVkCQCXAwEJAMwIAgkAlwMBCQDMCAIFA25vdwkAzAgCCQBkAgUJaXNzdWVUaW1lCQBoAgADBQpZRUFSTUlMTElTBQNuaWwJAMwIAgURT0xEX1NUQUtJTkdfREVBREwFA25pbAQJY3VyUGVyaW9kCQCXAwEJAMwIAgkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQUKWUVBUk1JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEIZ2V0TGFuZHMDBQt1c2VyQWRkck9wdAkAkQMCBQljb250cmFjdHMFC2RhcHBTdGFraW5nCQCRAwIFCWNvbnRyYWN0cwUJZGFwcEFjcmVzBBVjdXJQZXJpb2REaXN0cmlidXRpb24JARRkaXN0cmlidXRpb25CeVBlcmlvZAEFCWN1clBlcmlvZAQIJHQwNzkxNDMDCQAAAgUObGFzdFVzZXJQZXJpb2QFCWN1clBlcmlvZAQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkBQxsYXN0VXNlclRpbWUFCllFQVJNSUxMSVMECHVzZXJQYXJ0CQBrAwUCYTAFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUJAGQCBQxsYXN0VXNlclRpbWUJAGsDCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQ91c2VyUHJvcG9ydGlvbjYFAk02CQCVCgMFCHVzZXJQYXJ0BQJhMAUHZWZmVGltZQMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABBAJhMQkAawMJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFDGxhc3RVc2VyVGltZQUKWUVBUk1JTExJUwQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kBQpZRUFSTUlMTElTBAVhdmFpbAkAZAIFAmExBQJhMAQIdXNlclBhcnQJAGsDBQVhdmFpbAUPdXNlclByb3BvcnRpb242BQJNNgQHZWZmVGltZQMJAGcCBQJhMQUIdXNlclBhcnQJAGQCBQxsYXN0VXNlclRpbWUJAGsDBQpZRUFSTUlMTElTBQh1c2VyUGFydAkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMFCWN1clBlcmlvZAkAawMFCllFQVJNSUxMSVMJAGUCBQh1c2VyUGFydAUCYTEFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAlQoDBQh1c2VyUGFydAUFYXZhaWwFB2VmZlRpbWUEAmEyCQBrAwkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAACCQBlAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMJAGUCBQljdXJQZXJpb2QAAQUMbGFzdFVzZXJUaW1lBQpZRUFSTUlMTElTBAJhMQkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFCllFQVJNSUxMSVMEBWF2YWlsCQBkAgkAZAIFAmEyBQJhMQUCYTAECHVzZXJQYXJ0CQBrAwUFYXZhaWwFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUDCQBnAgUCYTIFCHVzZXJQYXJ0CQBkAgUMbGFzdFVzZXJUaW1lCQBrAwUKWUVBUk1JTExJUwUIdXNlclBhcnQJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgMJAGcCCQBkAgUCYTIFAmExBQh1c2VyUGFydAkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEJAGsDBQpZRUFSTUlMTElTCQBlAgUIdXNlclBhcnQFAmEyCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAEJAGQCCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kCQBrAwUKWUVBUk1JTExJUwkAZQIJAGUCBQh1c2VyUGFydAUCYTIFAmExBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAJUKAwUIdXNlclBhcnQFBWF2YWlsBQdlZmZUaW1lBAp1c2VyQW1vdW50CAUIJHQwNzkxNDMCXzEEDXVzZXJBdmFpbGFibGUIBQgkdDA3OTE0MwJfMgQLZWZmTGFzdFRpbWUIBQgkdDA3OTE0MwJfMwQQc0xhbmREYWlseUFtb3VudAkAawMJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24FCURBWU1JTExJUwUKWUVBUk1JTExJUwAZCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUUc3Rha2Vyc0Ftb3VudExlZnRLZXkAAAQIdXNlclRlbXAJAGsDBQp1c2VyQW1vdW50CQBkAgkAaAIJAJEDAgUDZWZmBQ1pZHhVc2VyUGllY2VzBQJNOAkAkQMCBQNlZmYFDGlkeFVzZXJBY3JlcwkAZAIJAGgCCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMFAk04CQCRAwIFA2VmZgUNaWR4VG90YWxBY3JlcwQMYmFua0Zyb21Vc2VyCQBrAwUIdXNlclRlbXAFCEJBTktfRkVFBQJNNgQKcm9iYmVkVXNlcgkAZQIFCHVzZXJUZW1wBQxiYW5rRnJvbVVzZXIEDHVucm9iYmVkVXNlcgkAawMFDXVzZXJBdmFpbGFibGUJAGQCCQBoAgkAkQMCBQNlZmYFDWlkeFVzZXJQaWVjZXMFAk04CQCRAwIFA2VmZgUMaWR4VXNlckFjcmVzCQBkAgkAaAIJAJEDAgUDZWZmBQ5pZHhUb3RhbFBpZWNlcwUCTTgJAJEDAgUDZWZmBQ1pZHhUb3RhbEFjcmVzCQDMCAIFDGlzc3VlZEFtb3VudAkAzAgCCQBrAwkAZQIFDXRvdGFsRnVuZHNVc2QFE1VTRFRfVFZMX0NPUlJFQ1RJT04FAk04BQxpc3N1ZWRBbW91bnQJAMwIAgUNdG90YWxGdW5kc1VzZAkAzAgCBQplY29ub215VXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUGd2xnVXNkCQDMCAIFCXB1enpsZVVzZAkAzAgCBQlpc3N1ZVRpbWUJAMwIAgUMbGFzdFRlYW1UaW1lCQDMCAIFCXRlYW1Ub3RhbAkAzAgCBQ50ZWFtQW1vdW50TGVmdAkAzAgCBRZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCnRlYW1XbGdvbGQJAMwIAgUIYWN0VG90YWwJAMwIAgUNYWN0QW1vdW50TGVmdAkAzAgCBRVhY3RBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUJYWN0V2xnb2xkCQDMCAIFCWN1clBlcmlvZAkAzAgCBQ9hbW91bnRMZWZ0VG90YWwJAMwIAgUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQDMCAIFDGxhc3RVc2VyVGltZQkAzAgCBQpyb2JiZWRVc2VyCQDMCAIFEHNMYW5kRGFpbHlBbW91bnQJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFDHVucm9iYmVkVXNlcgkAzAgCBQtlZmZMYXN0VGltZQkAzAgCBQpiYW5rV2xnb2xkBQNuaWwAA002XwDAhD0AA004XwCAwtcvAApURUFNX1NIQVJFAMCaDAAOQUNUSVZJVFlfU0hBUkUAoI0GAAxQTEFZRVJfU0hBUkUAgLUYAAtZRUFSX01JTExJUwCAhuvHdQAGREFZX01TAIC4mSkAB0lTU1VFMTAAgJTr3AMAD1BMQVlFUlMxMF9TSEFSRQCA6jAAEU1BUktFVElORzEwX1NIQVJFAKCNBgAMVEVBTTEwX1NIQVJFAKCNBgARTkVXX1NUQUtJTkdfU1RBUlQAgPO4wrEyABBtYXJrZXRpbmdBZGRyS2V5Ag1tYXJrZXRpbmdBZGRyAAp0ZWFtQWRyS2V5Agh0ZWFtQWRkcgAObGFzdFRlYW1UaW1LZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtAA50ZWFtQW10TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFGxhc3RBY3Rpdml0aWVzVGltS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwANYWN0QW10TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAEXN0YWtlcnNBbXRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEEYWRkcgkArAICAhRsYXN0Q2xhaW1lZFRpbWVVc2VyXwUEYWRkcgENZGlzdHJCeVBlcmlvZAIMaXNzdWVkQW1vdW50BnBlcmlvZAkAawMFDGlzc3VlZEFtb3VudAkAaAIFDFBMQVlFUl9TSEFSRQkAZAIFBnBlcmlvZAABCQBoAgAGBQNNNl8AEXdsZ0lzc3VlMTBUaW1lS2V5Ag93bGdfaXNzdWUxMFRpbWUADndsZ0lzc3VlVGltS2V5Ag13bGdfaXNzdWVUaW1lAA93bGdJc3N1ZWRBbXRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADnpiSXNzdWVkQW10S2V5AhJ6YmlsbF9pc3N1ZWRBbW91bnQBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgASYWNyZXNTdGFrZFRvdGFsS2V5AhZhY3Jlc1N0YWtlZEFtb3VudFRvdGFsABR0b3RhbEZhcm1pbmdQb3dlcktleQIRdG90YWxGYXJtaW5nUG93ZXIACWRhcHAyUmVzdAAAAAxkYXBwMlN0YWtpbmcAAQAIZGFwcDJXbGcAAgALZGFwcDJQdXp6bGUAAwAPZGFwcDJJbnZlc3RGdW5kAAQAFURFRkFVTFRfV0VFS0xZX1BSSVpFUwAFAA1BQ1JFU19GT1JfQkVUAIDC1y8AEWtleU5mdFRvdGFsSXNzdWVkAg5uZnRUb3RhbElzc3VlZAARa2V5TmZ0VG90YWxCdXJuZWQCDm5mdFRvdGFsQnVybmVkABNrZXlXbE5mdFRvdGFsU3Rha2VkAhBXbE5mdFRvdGFsU3Rha2VkARJrZXlVc2VyV2xOZnROdW1iZXIBBGFkZHIJAKwCAgIQdXNlcldsTmZ0TnVtYmVyXwUEYWRkcgEQa2V5VXNlckZ1bGxCb251cwEEYWRkcgkArAICAg51c2VyRnVsbEJvbnVzXwUEYWRkcgAKbGV2ZWxBY3JlcwkAzAgCAAAJAMwIAgAKCQDMCAIAFAkAzAgCACgJAMwIAgBQCQDMCAIAlgEJAMwIAgD6AQkAzAgCAJADCQDMCAIAvAUJAMwIAgDoBwUDbmlsAQ9nZXRMZXZlbEJ5QWNyZXMBBWFjcmVzBANhY3IJAGkCCQBkAgUFYWNyZXMA/8HXLwUDTThfCgEHY2hlY2tlcgIDYWNjBGl0ZW0DCQBnAgUEaXRlbQUDYWNyBQNhY2MJAGQCBQNhY2MAAQoAAiRsBQpsZXZlbEFjcmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQVhY3JlcwkAaAIJAGgCBQVhY3JlcwAUCQBkAgkBD2dldExldmVsQnlBY3JlcwEFBWFjcmVzAAQBHmdldEZhcm1pbmdQb3dlckJ5QWNyZXNBbmRCb251cwIFYWNyZXMGYm9udXM2BApub3RCb251c2VkCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFBWFjcmVzCQCUCgIJAGsDBQpub3RCb251c2VkCQBkAgUDTTZfBQZib251czYFA002XwUKbm90Qm9udXNlZAEQZ2V0RmFybWluZ1Bvd2VycwISdXNlckFkZHJTdHJPckVtcHR5DmFjcmVzMkNvbnRyYWN0BAd0b3RhbEZQCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0BRR0b3RhbEZhcm1pbmdQb3dlcktleQAABAl1c2VyQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAABAl1c2VyQm9udXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARBrZXlVc2VyRnVsbEJvbnVzAQUSdXNlckFkZHJTdHJPckVtcHR5AAAECCR0MDc5MTQzCQEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgUJdXNlckFjcmVzBQl1c2VyQm9udXMEDXVzZXJGUGJvbnVzZWQIBQgkdDA3OTE0MwJfMQQQdXNlckZQbm90Qm9udXNlZAgFCCR0MDc5MTQzAl8yCQDMCAIFB3RvdGFsRlAJAMwIAgUNdXNlckZQYm9udXNlZAkAzAgCBRB1c2VyRlBub3RCb251c2VkCQDMCAIFCXVzZXJCb251cwUDbmlsAAppZHhUb3RhbEZQAAAAEGlkeFVzZXJGUGJvbnVzZWQAAQEMZ2V0V2xnU3RhdHMyBAt1c2VyQWRkck9wdAljb250cmFjdHMGdXNkdElkFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQMaXNzdWVkQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQHcmVzdFVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUJZGFwcDJSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQZ1c2R0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQJcHV6emxlVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwMlB1enpsZQUGdXNkdElkBAlhY3JlczJVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUGdXNkdElkBBFpbnZlc3RGbmRDb250cmFjdAkAkQMCBQljb250cmFjdHMFD2RhcHAySW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRFpbnZlc3RGbmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEWludmVzdEZuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCWFjcmVzMlVzZAUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwEBXdsZ0lkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ53bGdJc3N1ZVRpbUtleQIPTm90IGluaXRpYWxpemVkBAZ3bGdXbGcJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQV3bGdJZAQJdGVhbVRvdGFsCQBrAwUMaXNzdWVkQW1vdW50BQpURUFNX1NIQVJFBQNNNl8EDnRlYW1BbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUOdGVhbUFtdExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUObGFzdFRlYW1UaW1LZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQp0ZWFtQWRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQtZRUFSX01JTExJUwkAzAgCBQ50ZWFtQW1vdW50TGVmdAUDbmlsBAp0ZWFtV2xnb2xkCQDwBwIFCHRlYW1BZGRyBQV3bGdJZAQIYWN0VG90YWwJAGsDBQxpc3N1ZWRBbW91bnQFDkFDVElWSVRZX1NIQVJFBQNNNl8EDWFjdEFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ1hY3RBbXRMZWZ0S2V5BQhhY3RUb3RhbAQSbGFzdEFjdGl2aXRpZXNUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUUbGFzdEFjdGl2aXRpZXNUaW1LZXkFCWlzc3VlVGltZQQVYWN0QW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCGFjdFRvdGFsCQBlAgUDbm93BRJsYXN0QWN0aXZpdGllc1RpbWUJAGgCAAMFC1lFQVJfTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQlkYXBwMlJlc3QFBXdsZ0lkBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnCQEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwQKbm93TGltaXRlZAkAlwMBCQDMCAIFA25vdwkAzAgCCQBkAgUJaXNzdWVUaW1lCQBoAgADBQtZRUFSX01JTExJUwUDbmlsBAljdXJQZXJpb2QJAJcDAQkAzAgCCQBpAgkAZQIFA25vdwUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEQZ2V0RmFybWluZ1Bvd2VycwIFC3VzZXJBZGRyT3B0CQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBBVjdXJQZXJpb2REaXN0cmlidXRpb24JAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50BQljdXJQZXJpb2QEDXByZXZQZXJpb2RFbmQJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kBBFwcmV2UHJldlBlcmlvZEVuZAkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwQNdXNlckF2YWlsYWJsZQMJAAACBQ5sYXN0VXNlclBlcmlvZAUJY3VyUGVyaW9kBQJhMAMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABBAJhMQkAawMJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAEJAGUCBQ1wcmV2UGVyaW9kRW5kBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTCQBkAgUCYTEFAmEwBAJhMgkAawMJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAIJAGUCBRFwcmV2UHJldlBlcmlvZEVuZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwQCYTEJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAEJAGQCCQBkAgUCYTIFAmExBQJhMAQPYW1vdW50TGVmdFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwURc3Rha2Vyc0FtdExlZnRLZXkAAAQKdXNlckFtb3VudAMJAQIhPQIJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAJAGsDBQ11c2VyQXZhaWxhYmxlCQCRAwIFA2VmZgUQaWR4VXNlckZQYm9udXNlZAkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAQPbGFzdElzc3VlMTBUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwURd2xnSXNzdWUxMFRpbWVLZXkFEU5FV19TVEFLSU5HX1NUQVJUBA1pc3N1ZTEwQW1vdW50CQBrAwUHSVNTVUUxMAkAlgMBCQDMCAIJAGUCBQNub3cFD2xhc3RJc3N1ZTEwVGltZQkAzAgCAAAFA25pbAUGREFZX01TBBZtYXJrZXRpbmdJc3N1ZTEwQW1vdW50CQBrAwUNaXNzdWUxMEFtb3VudAURTUFSS0VUSU5HMTBfU0hBUkUFA002XwQRdGVhbUlzc3VlMTBBbW91bnQJAGsDBQ1pc3N1ZTEwQW1vdW50BQxURUFNMTBfU0hBUkUFA002XwQOdXNlcjEwSW50ZXJ2YWwJAJYDAQkAzAgCCQBlAgUDbm93CQCWAwEJAMwIAgURTkVXX1NUQUtJTkdfU1RBUlQJAMwIAgUMbGFzdFVzZXJUaW1lBQNuaWwJAMwIAgAABQNuaWwECnVzZXIxMHBhcnQDCQECIT0CCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAACQBrAwkAawMJAGsDBQdJU1NVRTEwBQ51c2VyMTBJbnRlcnZhbAUGREFZX01TCQCRAwIFA2VmZgUQaWR4VXNlckZQYm9udXNlZAkAkQMCBQNlZmYFCmlkeFRvdGFsRlAFD1BMQVlFUlMxMF9TSEFSRQUDTTZfAAAEDm5ld0lzc3VlMTBUaW1lCQCWAwEJAMwIAgURTkVXX1NUQUtJTkdfU1RBUlQJAMwIAgUDbm93BQNuaWwEEGFjcmVzU3Rha2VkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUSYWNyZXNTdGFrZFRvdGFsS2V5AAAEDm5mdFRvdGFsSXNzdWVkCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFEWtleU5mdFRvdGFsSXNzdWVkAAAEDm5mdFRvdGFsQnVybmVkCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFEWtleU5mdFRvdGFsQnVybmVkAAAEEHdsTmZ0VG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUTa2V5V2xOZnRUb3RhbFN0YWtlZAAABA93bE5mdFVzZXJTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwkBEmtleVVzZXJXbE5mdE51bWJlcgEJAQt2YWx1ZU9yRWxzZQIFC3VzZXJBZGRyT3B0AgAAAAkAzAgCBQxpc3N1ZWRBbW91bnQJAMwIAgUGd2xnV2xnCQDMCAIJAGsDBQ10b3RhbEZ1bmRzVXNkBQNNOF8FDGlzc3VlZEFtb3VudAkAzAgCBQ10b3RhbEZ1bmRzVXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUJYWNyZXMyVXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QJAMwIAgUJaXNzdWVUaW1lCQDMCAIFDGxhc3RUZWFtVGltZQkAzAgCBQl0ZWFtVG90YWwJAMwIAgUOdGVhbUFtb3VudExlZnQJAMwIAgUWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQp0ZWFtV2xnb2xkCQDMCAIFCGFjdFRvdGFsCQDMCAIFDWFjdEFtb3VudExlZnQJAMwIAgUVYWN0QW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCWFjdFdsZ29sZAkAzAgCBQljdXJQZXJpb2QJAMwIAgUPYW1vdW50TGVmdFRvdGFsCQDMCAIFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCBQxsYXN0VXNlclRpbWUJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFCnVzZXJBbW91bnQJAMwIAgUKbm93TGltaXRlZAkAzAgCBQ1pc3N1ZTEwQW1vdW50CQDMCAIFFm1hcmtldGluZ0lzc3VlMTBBbW91bnQJAMwIAgURdGVhbUlzc3VlMTBBbW91bnQJAMwIAgUKdXNlcjEwcGFydAkAzAgCBQ5uZXdJc3N1ZTEwVGltZQkAzAgCCQCRAwIFA2VmZgUKaWR4VG90YWxGUAkAzAgCBRBhY3Jlc1N0YWtlZFRvdGFsCQDMCAIFDm5mdFRvdGFsSXNzdWVkCQDMCAIFDm5mdFRvdGFsQnVybmVkCQDMCAIFEHdsTmZ0VG90YWxTdGFrZWQJAMwIAgUPd2xOZnRVc2VyU3Rha2VkBQNuaWwADXByb2ZpdEFkZHJLZXkCCnByb2ZpdEFkZHIAGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkCFnN0YWtlcnNBbW91bnRQYWlkVG90YWwBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEEYWRkcgkArAICAhZzdGFrZXJzQW1vdW50UGFpZFVzZXJfBQRhZGRyAQdwcm9sb2cyAAkBBWFzSW50AQkA/QcEBQ5hY3JlczJDb250cmFjdAIKc2F2ZUxhc3RUeAUDbmlsBQNuaWwBEmdldFN3YXBMaW1pdFdsZ29sZAEEYWRkcgQIbGFzdFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBQRhZGRyAAAEDGRlZmF1bHRMaW1pdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5hY3JlczJDb250cmFjdAkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQUEYWRkcgAABA1sYXN0TGltaXRMZWZ0CQELdmFsdWVPckVsc2UCCQCfCAEJARprZXlMYXN0V2xnVHJhZGVMaW1pdEJ5VXNlcgEFBGFkZHIFDGRlZmF1bHRMaW1pdAQMY3VycmVudExpbWl0CQBkAgUNbGFzdExpbWl0TGVmdAkAawMFDGRlZmF1bHRMaW1pdAkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhsYXN0VGltZQUKREFZX01JTExJUwkAlwMBCQDMCAIFDGN1cnJlbnRMaW1pdAkAzAgCBQxkZWZhdWx0TGltaXQFA25pbAAQaWR4V2xnVGVhbUFtTGVmdAAKABRpZHhXbGdUZWFtQW1BdmFpbE5vdwALAA9pZHhXbGdBY3RBbUxlZnQADgATaWR4V2xnQWN0QW1BdmFpbE5vdwAPABFpZHhXbGdBbUxlZnRUb3RhbAASABRpZHhXbGdVc2VyVG90YWxBdmFpbAAYABFpZHhXbGdFZmZVc2VyVGltZQAZAQ1jbGFpbUludGVybmFsAQRhZGRyBAZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIED2Vjb25vbXlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUSZWNvbm9teUNvbnRyYWN0U3RyBAhjdXJTdGF0cwkBC2dldFdsZ1N0YXRzBQUEYWRkcgkAzAgCBQxyZXN0Q29udHJhY3QJAMwIAgUPc3Rha2luZ0NvbnRyYWN0CQDMCAIFD2Vjb25vbXlDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0CQDMCAIFDWFjcmVzQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAUFTVVMVDYEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDnRlYW1BbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBRBpZHhXbGdUZWFtQW1MZWZ0BAp0ZWFtQW1vdW50CQCRAwIFCGN1clN0YXRzBRRpZHhXbGdUZWFtQW1BdmFpbE5vdwQNYWN0QW1vdW50TGVmdAkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnQWN0QW1MZWZ0BAlhY3RBbW91bnQJAJEDAgUIY3VyU3RhdHMFE2lkeFdsZ0FjdEFtQXZhaWxOb3cECnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFFGlkeFdsZ1VzZXJUb3RhbEF2YWlsBAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUEYWRkcgQJdXNlclRvdGFsCQCRAwIFCGN1clN0YXRzBRRpZHhXbGdVc2VyVG90YWxBdmFpbAQLdXNlckVmZlRpbWUJAJEDAgUIY3VyU3RhdHMFEWlkeFdsZ0VmZlVzZXJUaW1lCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFCWFjdEFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdXNlcktleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdXNlcktleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAFCXVzZXJUb3RhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCCQCRAwIFCGN1clN0YXRzBRFpZHhXbGdBbUxlZnRUb3RhbAUJdXNlclRvdGFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF0ZWFtQW1vdW50TGVmdEtleQkAZQIFDnRlYW1BbW91bnRMZWZ0BQp0ZWFtQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0VGVhbVRpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQYWN0QW1vdW50TGVmdEtleQkAZQIFDWFjdEFtb3VudExlZnQFCWFjdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIJARtrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXJPbGQBBQRhZGRyBQt1c2VyRWZmVGltZQUDbmlsBQp1c2VyQW1vdW50AQ5jbGFpbUludGVybmFsMgEEYWRkcgQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEBQRhZGRyCQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAt1c2VyVGltZUtleQkBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBQRhZGRyBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQULdXNlclRpbWVLZXkAAAQLdXNlckVmZlRpbWUJAJEDAgUIY3VyU3RhdHMFEGl4V2xnRWZmVXNlclRpbWUDCQAAAgUMbGFzdFVzZXJUaW1lBQt1c2VyRWZmVGltZQkAlAoCBQNuaWwAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQCRAwIFCGN1clN0YXRzBQ5peFdsZ0lzc3VlVGltZQQOdGVhbUFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFD2l4V2xnVGVhbUFtTGVmdAQKdGVhbUFtb3VudAkAZAIJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVGVhbUFtQXZhaWxOb3cJAJEDAgUIY3VyU3RhdHMFFml4V2xnVGVhbUlzc3VlMTBBbW91bnQEC3RlYW1BY3Rpb25zAwkAZgIFCnRlYW1BbW91bnQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdGVhbUFtb3VudExlZnRLZXkJAGQCCQBlAgUOdGVhbUFtb3VudExlZnQFCnRlYW1BbW91bnQJAJEDAgUIY3VyU3RhdHMFFml4V2xnVGVhbUlzc3VlMTBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2xhc3RUZWFtVGltZUtleQUDbm93CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQULdGVhbUFkZHJLZXkFCnRlYW1BbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBA1hY3RBbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBQ5peFdsZ0FjdEFtTGVmdAQJYWN0QW1vdW50CQCRAwIFCGN1clN0YXRzBRJpeFdsZ0FjdEFtQXZhaWxOb3cECmFjdEFjdGlvbnMDCQBmAgUJYWN0QW1vdW50AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEGFjdEFtb3VudExlZnRLZXkJAGUCBQ1hY3RBbW91bnRMZWZ0BQlhY3RBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWxhc3RBY3Rpdml0aWVzVGltZUtleQUDbm93CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUJYWN0QW1vdW50BQp3bGdBc3NldElkBQNuaWwFA25pbAQPbWFya2V0aW5nQW1vdW50CQCRAwIFCGN1clN0YXRzBRtpeFdsZ01hcmtldGluZ0lzc3VlMTBBbW91bnQEEW1hcmtldGluZ1RyYW5zZmVyAwkAZgIFD21hcmtldGluZ0Ftb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUQbWFya2V0aW5nQWRkcktleQUPbWFya2V0aW5nQW1vdW50BQp3bGdBc3NldElkBQNuaWwFA25pbAQKdXNlckFtb3VudAkAkQMCBQhjdXJTdGF0cwUTaXhXbGdVc2VyQW1BdmFpbE5vdwQHdXNlcktleQkBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEFBGFkZHIECXVzZXJUb3RhbAkAZAIFCnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFD2l4V2xnVXNlcjEwcGFydAQOaXNzdWVkMTBBbW91bnQJAJEDAgUIY3VyU3RhdHMFEml4V2xnSXNzdWUxMEFtb3VudAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUOaXNzdWVkMTBBbW91bnQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGQCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUOaXNzdWVkMTBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEXdsZ0lzc3VlMTBUaW1lS2V5CQCRAwIFCGN1clN0YXRzBRBpeFdsZ0lzc3VlMTBUaW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd1c2VyS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd1c2VyS2V5AAAFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCCQCRAwIFCGN1clN0YXRzBRBpeFdsZ0FtTGVmdFRvdGFsBQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQt1c2VyVGltZUtleQULdXNlckVmZlRpbWUFA25pbAULdGVhbUFjdGlvbnMFCmFjdEFjdGlvbnMFEW1hcmtldGluZ1RyYW5zZmVyBQl1c2VyVG90YWwBDnRha2VYcEludGVybmFsAgRhZGRyBWRlbHRhBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAd0aW1lS2V5CQEWa2V5V2xnU3Rha2VkVGltZUJ5VXNlcgEFBGFkZHIECWFtb3VudEtleQkBGGtleVdsZ1N0YWtlZEFtb3VudEJ5VXNlcgEFBGFkZHIECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFB3RpbWVLZXkAAAQHb2xkVXNlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURd2xnU3Rha2VkVG90YWxLZXkAAAQCeHAJAGsDCQBrAwUFeHBXbGcFB29sZFVzZXIFD3dsZ0Jhc2VBbW91bnRYcAkAZQIFCGxhc3RUaW1lBQNub3cFCURBWU1JTExJUwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQkAZAIFB29sZFVzZXIFBWRlbHRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF3bGdTdGFrZWRUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQVkZWx0YQUDbmlsBQJ4cAUHb2xkVXNlcgERb3BlbkNoZXN0SW50ZXJuYWwBBGFkZHIEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTBAhkcmF3V2VlawkAZQIFBHdlZWsAAQQJbnVtUHJpemVzCQELdmFsdWVPckVsc2UCCQCfCAEJAQ5rZXlOdW1ORlQyRHJhdwEFCGRyYXdXZWVrBRVERUZBVUxUX1dFRUtMWV9QUklaRVMEC3ByaXplc0RyYXduCQELdmFsdWVPckVsc2UCCQCfCAEJAQ5rZXlOdW1ORlREcmF3bgEFCGRyYXdXZWVrAAAEC3VzZXJUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawAAAwkAZwIAAAULdXNlclRpY2tldHMJAJQKAgUDbmlsBQR1bml0BAx0b3RhbFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQhkcmF3V2VlawAAAwkAZwIAAAUMdG90YWxUaWNrZXRzCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrBQNuaWwFBHVuaXQEB2VudHJvcHkJAQV2YWx1ZQEICQEFdmFsdWUBCQDtBwEJAGgCBQR3ZWVrBQtXRUVLX0JMT0NLUwN2cmYEBHNhbHQJANkEAQkAkQMCCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUOYWNyZXMyQ29udHJhY3QJARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBQRhZGRyAgo0Ml9ERUZBVUxUAgFfAAEEB3JhbmRvbTQJAQ9nZXRSYW5kb21OdW1iZXIDBQJNNAUEc2FsdAUHZW50cm9weQMJAQVpc1dpbgQFC3VzZXJUaWNrZXRzBQx0b3RhbFRpY2tldHMFCW51bVByaXplcwUHcmFuZG9tNAQDcm5kCQEPZ2V0UmFuZG9tTnVtYmVyAwBkCQDLAQIBAUIFBHNhbHQFB2VudHJvcHkEC3ByaXplUmVzdWx0AwkAZwIFA3JuZABaCQD8BwQFDmFjcmVzMkNvbnRyYWN0Agtpc3N1ZVBpY2tDMQkAzAgCBQRhZGRyBQNuaWwFA25pbAkA/AcEBQ1hY3Jlc0NvbnRyYWN0AgxzZW5kQWNyZXNGb3IJAMwIAgUEYWRkcgkAzAgCAMDw9QsFA25pbAUDbmlsBAd3aW5uZXJzCQCiCAEJAQ5rZXlXZWVrV2lubmVycwEFCGRyYXdXZWVrBApuZXdXaW5uZXJzAwkBCWlzRGVmaW5lZAEFB3dpbm5lcnMJAKwCAgkArAICCQEFdmFsdWUBBQd3aW5uZXJzAgFfBQRhZGRyBQRhZGRyCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlOdW1ORlREcmF3bgEFCGRyYXdXZWVrCQBkAgULcHJpemVzRHJhd24AAQkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVdlZWtXaW5uZXJzAQUIZHJhd1dlZWsFCm5ld1dpbm5lcnMFA25pbAULcHJpemVSZXN1bHQEB3JhbmRvbTEJAGQCCQEPZ2V0UmFuZG9tTnVtYmVyAwAJCQDLAQIBAUIFBHNhbHQFB2VudHJvcHkAAQQLY29uc1RpY2tldHMJAGsDBQt1c2VyVGlja2V0cwUHcmFuZG9tMQAKBAp0aWNrZXRzS2V5CQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUEd2VlawQKb2xkVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQp0aWNrZXRzS2V5AAAJAJQKAgkAzQgCAwkAAAIFC2NvbnNUaWNrZXRzAAAFA25pbAQNY29tbW9uQWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5VG90YWxXZWVrVGlja2V0cwEFBHdlZWsAAAULY29uc1RpY2tldHMJAMwIAgkBDEludGVnZXJFbnRyeQIFCnRpY2tldHNLZXkJAGQCBQpvbGRUaWNrZXRzBQtjb25zVGlja2V0cwUDbmlsAwkAZgIFCm9sZFRpY2tldHMAAAUNY29tbW9uQWN0aW9ucwkAzQgCBQ1jb21tb25BY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrAAAAAQkBC0RlbGV0ZUVudHJ5AQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrBQtjb25zVGlja2V0cwEUY2xhaW1UaWNrZXRzSW50ZXJuYWwCBGFkZHIKdXNlckJldFN0cgQEd2VlawkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MECnRpY2tldHNLZXkJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBAZkYXlCZXQJALUJAgUKdXNlckJldFN0cgIBXwQPb2xkVG90YWxUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEJARNrZXlUb3RhbFdlZWtUaWNrZXRzAQUEd2VlawAABApvbGRUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEFCnRpY2tldHNLZXkAAAQMZGVsdGFUaWNrZXRzAwkAAAIJAQp3aW5uaW5nQmV0AQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBmRheUJldAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGZGF5QmV0AAEAAQAABA9vbGRQYXJ0aWNpcGFudHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsAAAQSdXBkYXRlUGFydGljaXBhbnRzAwMJAAACBQpvbGRUaWNrZXRzAAAJAAACBQxkZWx0YVRpY2tldHMAAQcJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrCQBkAgUPb2xkUGFydGljaXBhbnRzAAEFA25pbAUDbmlsCQCUCgIDCQAAAgUMZGVsdGFUaWNrZXRzAAAFA25pbAkAzQgCCQDNCAIFEnVwZGF0ZVBhcnRpY2lwYW50cwkBDEludGVnZXJFbnRyeQIFCnRpY2tldHNLZXkJAGQCBQpvbGRUaWNrZXRzBQxkZWx0YVRpY2tldHMJAQxJbnRlZ2VyRW50cnkCCQETa2V5VG90YWxXZWVrVGlja2V0cwEFBHdlZWsJAGQCBQ9vbGRUb3RhbFRpY2tldHMFDGRlbHRhVGlja2V0cwUMZGVsdGFUaWNrZXRzEAFpAQ1jb25zdHJ1Y3RvclYxBAhyZXN0QWRkcg1tYXJrZXRpbmdBZGRyCHRlYW1BZGRyCnByb2ZpdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAMJAQlpc0RlZmluZWQBCQChCAEFDXdsZ0Fzc2V0SWRLZXkJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkBAxpc3N1ZWRBbW91bnQFCE1JTExJT042BAVpc3N1ZQkAwwgHAgZXTEdPTEQCIFdhdmVzTGFuZHMgR29sZCBpbnZlc3RtZW50IHRva2VuBQxpc3N1ZWRBbW91bnQACAYFBHVuaXQAAAQHYXNzZXRJZAkAuAgBBQVpc3N1ZQkAzAgCBQVpc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPd2xnSXNzdWVUaW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQxpc3N1ZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGsDBQhNSUxMSU9ONgULUExBWUVSU0hBUkUFBU1VTFQ2CQDMCAIJAQtCaW5hcnlFbnRyeQIFDXdsZ0Fzc2V0SWRLZXkFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVJlc3RBZGRyZXNzAAUIcmVzdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUQbWFya2V0aW5nQWRkcktleQUNbWFya2V0aW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQt0ZWFtQWRkcktleQUIdGVhbUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUNcHJvZml0QWRkcktleQUKcHJvZml0QWRkcgUDbmlsAWkBDWNvbnN0cnVjdG9yVjIBCXJlc3QyQWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIFA25pbAFpAQZidXlXbGcBDG1pblRvUmVjZWl2ZQQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQHdXNkdEFtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUHdXNkdEFtdAkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHRyYWRlIG1pbiAJAQpmaXhlZFBvaW50AgUOTUlOU0hPUFBBWU1FTlQABgIFIFVTRFQECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAUHdXNkdEFtdAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAQId2xnUHJpY2UJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UECGJ1eVByaWNlCQBuBAUId2xnUHJpY2UABgAFBQdDRUlMSU5HBAl3bGdBbW91bnQJAGsDBQd1c2R0QW10BQVNVUxUOAUIYnV5UHJpY2UEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFBGFkZHIDCQBmAgUJd2xnQW1vdW50BQZtYXhXbGcJAAIBCQCsAgIJAKwCAgIQWW91IGNhbiBnZXQgbWF4IAkBCmZpeGVkUG9pbnQCBQZtYXhXbGcACAIVIFdMR09MRCBhdCB0aGUgbW9tZW50AwkAZgIFDG1pblRvUmVjZWl2ZQUJd2xnQW1vdW50CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAYJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFCndsZ0Fzc2V0SWQFCXdsZ0Ftb3VudAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZAIFDGN1cldsZ0Ftb3VudAUJd2xnQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5TGFzdFdsZ1RyYWRlTGltaXRCeVVzZXIBBQRhZGRyCQBlAgUGbWF4V2xnBQl3bGdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQ1wcm9maXRBZGRyS2V5BQxwcm9maXRBbW91bnQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJd2xnQW1vdW50BQp3bGdBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5idXlXbGdSRUFET05MWQIHYWRkcmVzcwd1c2R0QW10BAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQFB3VzZHRBbXQECHdsZ1ByaWNlCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlBAhidXlQcmljZQkAbgQFCHdsZ1ByaWNlAAYABQUHQ0VJTElORwQJd2xnQW1vdW50CQBrAwUHdXNkdEFtdAUFTVVMVDgFCGJ1eVByaWNlBAZtYXhXbGcJARJnZXRTd2FwTGltaXRXbGdvbGQBBQdhZGRyZXNzBAdtYXhVc2R0CQBrAwUGbWF4V2xnBQhidXlQcmljZQUFTVVMVDgEDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABgkAlAoCBQNuaWwJAMwIAgUJd2xnQW1vdW50CQDMCAIFDk1JTlNIT1BQQVlNRU5UCQDMCAIFB21heFVzZHQJAMwIAgUMcHJvZml0QW1vdW50BQNuaWwBaQEHc2VsbFdsZwEJbWluQW1vdW50BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFBGFkZHIDCQBmAgUGd2xnQW10BQZtYXhXbGcJAAIBCQCsAgIJAKwCAgISWW91IGNhbiBzcGVuZCBtYXggCQEKZml4ZWRQb2ludAIFBm1heFdsZwAIAhUgV0xHT0xEIGF0IHRoZSBtb21lbnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAQJc2VsbFByaWNlCQBpAgkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQACBAd1c2R0QW10CQBrAwUGd2xnQW10BQlzZWxsUHJpY2UFBU1VTFQ4AwkAZgIFDk1JTlNIT1BQQVlNRU5UBQd1c2R0QW10CQACAQkArAICCQCsAgICEllvdSBjYW4gdHJhZGUgbWluIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGAgUgVVNEVAMJAGYCBQltaW5BbW91bnQFB3VzZHRBbXQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABQkAlAoCCQDMCAIJAQRCdXJuAgUKd2xnQXNzZXRJZAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGUCBQxjdXJXbGdBbW91bnQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleUxhc3RXbGdUcmFkZUxpbWl0QnlVc2VyAQUEYWRkcgkAZQIFBm1heFdsZwUGd2xnQW10CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB3VzZHRBbXQFC3VzZHRBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9zZWxsV2xnUkVBRE9OTFkCB2FkZHJlc3MGd2xnQW10BAZtYXhXbGcJARJnZXRTd2FwTGltaXRXbGdvbGQBBQdhZGRyZXNzBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQJc2VsbFByaWNlCQBpAgkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQACBAd1c2R0QW10CQBrAwUGd2xnQW10BQlzZWxsUHJpY2UFBU1VTFQ4BAZtaW5XbGcJAGsDBQ5NSU5TSE9QUEFZTUVOVAUFTVVMVDgFCXNlbGxQcmljZQQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAFCQCUCgIFA25pbAkAzAgCBQd1c2R0QW10CQDMCAIFBm1pbldsZwkAzAgCBQZtYXhXbGcJAMwIAgUMcHJvZml0QW1vdW50BQNuaWwBaQEFY2xhaW0ABAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA0kdDAxNjY2MzE2NzMyCQEOY2xhaW1JbnRlcm5hbDIBCQClCAEIBQFpBmNhbGxlcgQHYWN0aW9ucwgFDSR0MDE2NjYzMTY3MzICXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxNjY2MzE2NzMyAl8yCQCUCgIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESb25TdGFrZVVuc3Rha2VMYW5kAQRhZGRyAwMDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkBAiE9AggFAWkGY2FsbGVyBQ1hY3Jlc0NvbnRyYWN0BwkBAiE9AggFAWkGY2FsbGVyBQ5hY3JlczJDb250cmFjdAcJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNJHQwMTcwNTIxNzEwOQkBDmNsYWltSW50ZXJuYWwyAQUEYWRkcgMJAAACBQ0kdDAxNzA1MjE3MTA5BQ0kdDAxNzA1MjE3MTA5BBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTcwNTIxNzEwOQJfMgQHYWN0aW9ucwgFDSR0MDE3MDUyMTcxMDkCXzEJAJQKAgMJAGYCBRB3bGdDbGFpbWVkQW1vdW50AAAJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgUQd2xnQ2xhaW1lZEFtb3VudAUKd2xnQXNzZXRJZAUHYWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVvblN0YWtlVW5zdGFrZUxhbmRPbGQBBGFkZHIDAwMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQECIT0CCAUBaQZjYWxsZXIFDWFjcmVzQ29udHJhY3QHCQECIT0CCAUBaQZjYWxsZXIFDmFjcmVzMkNvbnRyYWN0BwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA0kdDAxNzQ5MjE3NTQ4CQENY2xhaW1JbnRlcm5hbAEFBGFkZHIDCQAAAgUNJHQwMTc0OTIxNzU0OAUNJHQwMTc0OTIxNzU0OAQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDE3NDkyMTc1NDgCXzIEB2FjdGlvbnMIBQ0kdDAxNzQ5MjE3NTQ4Al8xCQCUCgIDCQBmAgUQd2xnQ2xhaW1lZEFtb3VudAAACQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIFEHdsZ0NsYWltZWRBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUQd2xnQ2xhaW1lZEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpidXJuV2xnb2xkAQZ3bGdBbXQDAwkBAiE9AggFAWkGY2FsbGVyBQ5hY3JlczJDb250cmFjdAkBAiE9AggFAWkGY2FsbGVyBQ5tYXJrZXRDb250cmFjdAcJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAADCQBmAgUGd2xnQW10CQCRAwIFCGN1clN0YXRzBQhpeFdsZ1dsZwkAAgEJAKwCAgkArAICCQCsAgICBU9ubHkgCQEKZml4ZWRQb2ludAIJAJEDAgUIY3VyU3RhdHMFCGl4V2xnV2xnAAgCJSBXTEdPTEQgbGVmdCBvbiBjb250cmFjdCwgY2FuJ3QgYnVybiAJAQpmaXhlZFBvaW50AgUGd2xnQW10AAgEDXdsZ0Ftb3VudExlZnQJAGUCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUGd2xnQW10CQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUNd2xnQW1vdW50TGVmdAUDbmlsBQ13bGdBbW91bnRMZWZ0AWkBDGJldEZvclRpY2tldAEDYmV0BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBAt1c2VyVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsAAAQLd2Vla1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQhkcmF3V2VlawAAAwMJAGYCBQt1c2VyVGlja2V0cwAACQBmAgULd2Vla1RpY2tldHMAAAcJAAIBAhtQbGVhc2Ugb3BlbiB0aGUgY2hlc3QgZmlyc3QDCQECIT0CCQBpAgUDYmV0AAQAAAkAAgECG0ludmFsaWQgYmV0OiBzaG91bGQgYmUgMC4uMwQGbW9tZW50CQBqAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAwkAZgIFBm1vbWVudAkAZQIFCkRBWV9CTE9DS1MAAwkAAgEJAKwCAgkArAICAjFDYW5ub3QgYmV0OiB0aGUgZGF5IGlzIGFsbW9zdCBlbmRlZCwgcGxlYXNlIHdhaXQgCQCkAwEJAGUCBQpEQVlfQkxPQ0tTBQZtb21lbnQCByBibG9ja3MEC3N0YWtlZEFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQRhZGRyAAADCQBmAgUNQUNSRVNfRk9SX0JFVAULc3Rha2VkQWNyZXMJAAIBCQCsAgIJAKwCAgIbWW91IG5lZWQgdG8gc3Rha2UgYXQgbGVhc3QgCQEKZml4ZWRQb2ludAIFDUFDUkVTX0ZPUl9CRVQACAINIEFDUkVTIHRvIGJldAQIdG9tb3Jyb3cJAGQCCQBpAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAAEEBmJldEtleQkBCmtleVVzZXJCZXQBBQRhZGRyBA1vbGRVc2VyQmV0U3RyCQCiCAEFBmJldEtleQQLbmV3QmV0RW50cnkJAQtTdHJpbmdFbnRyeQIFBmJldEtleQkArAICCQCsAgIJAKQDAQUIdG9tb3Jyb3cCAV8JAKQDAQUDYmV0AwkBCWlzRGVmaW5lZAEFDW9sZFVzZXJCZXRTdHIEB3VzZXJCZXQJAQV2YWx1ZQEFDW9sZFVzZXJCZXRTdHIDCQAAAgkAkQMCCQC1CQIFB3VzZXJCZXQCAV8AAAkApAMBBQh0b21vcnJvdwkAAgECHFlvdSBhbHJlYWR5IGJldCBmb3IgdG9tb3Jyb3cEAXIJARRjbGFpbVRpY2tldHNJbnRlcm5hbAIFBGFkZHIFB3VzZXJCZXQJAJQKAgkAzQgCCAUBcgJfMQULbmV3QmV0RW50cnkIBQFyAl8yCQCUCgIJAMwIAgULbmV3QmV0RW50cnkFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXRha2VXbGdYcAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDIwMTgwMjAyMjMJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHYWN0aW9ucwgFDSR0MDIwMTgwMjAyMjMCXzEEAnhwCAUNJHQwMjAxODAyMDIyMwJfMgkAlAoCBQdhY3Rpb25zBQJ4cAFpARJjaGVja1dsZ1hwUkVBRE9OTFkBBGFkZHIEDSR0MDIwMzAwMjAzNDgJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHaWdub3JlZAgFDSR0MDIwMzAwMjAzNDgCXzEEB2RlbHRhWFAIBQ0kdDAyMDMwMDIwMzQ4Al8yBAVuZXdYUAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEJa2V5VXNlclhQAQUEYWRkcgAABQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQRhZGRyAAAFBW5ld1hQCQCUCgIFA25pbAkAzQgCBQlsdmxQb2ludHMFBW5ld1hQAWkBDHNldE51bVByaXplcwEJbnVtUHJpemVzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlOdW1ORlQyRHJhdwEFBHdlZWsFCW51bVByaXplcwUDbmlsBQludW1Qcml6ZXMBaQEJb3BlbkNoZXN0AAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLdXNlclRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrAAADCQBnAgAABQt1c2VyVGlja2V0cwkAAgECGU5vIGdlbXMgdG8gb3BlbiB0aGUgY2hlc3QJARFvcGVuQ2hlc3RJbnRlcm5hbAEFBGFkZHIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYWRkR2Vtc0ZvcgIEYWRkcgxkZWx0YVRpY2tldHMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQEd2VlawkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MECnRpY2tldHNLZXkJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBA9vbGRUb3RhbFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrAAAECm9sZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdGlja2V0c0tleQAABA9vbGRQYXJ0aWNpcGFudHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsAAAQSdXBkYXRlUGFydGljaXBhbnRzAwMJAAACBQpvbGRUaWNrZXRzAAAJAAACBQxkZWx0YVRpY2tldHMAAQcJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrCQBkAgUPb2xkUGFydGljaXBhbnRzAAEFA25pbAUDbmlsCQCUCgIJAM0IAgkAzQgCBRJ1cGRhdGVQYXJ0aWNpcGFudHMJAQxJbnRlZ2VyRW50cnkCBQp0aWNrZXRzS2V5CQBkAgUKb2xkVGlja2V0cwUMZGVsdGFUaWNrZXRzCQEMSW50ZWdlckVudHJ5AgkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrCQBkAgUPb2xkVG90YWxUaWNrZXRzBQxkZWx0YVRpY2tldHMFDGRlbHRhVGlja2V0cwCi1i14", "height": 3422369, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 53rW9Ba4zwe6GQjwSpduXNstE5AytXWAybVmptYug5aP Next: GgFwSmoGs3sUbhcrnfWtc47ns3PbnFmt3xKXrz18iczK Diff:
OldNewDifferences
223223 }
224224
225225
226+let M4 = 10000
227+
226228 let SCALE8 = 100000000
227229
228230 let xpLevelScale = 3200
247249 func levelUp (currLevel,newXP) = {
248250 let newLevel = levelByXP(newXP)
249251 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
252+ }
253+
254+
255+func isWin (userTickets,totalTickets,numPrizes,random4) = {
256+ let a4 = fraction(M4, (totalTickets - userTickets), totalTickets)
257+ let p4 = pow(a4, 4, numPrizes, 0, 4, DOWN)
258+ ((M4 - random4) > p4)
250259 }
251260
252261
748757 if ((0 >= userTickets))
749758 then $Tuple2(nil, unit)
750759 else {
751- let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
752- if ((0 >= weekTickets))
760+ let totalTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
761+ if ((0 >= totalTickets))
753762 then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
754763 else {
755764 let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
756765 let salt = fromBase58String(split(valueOrElse(getString(acres2Contract, keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
757- let random = getRandomNumber(weekTickets, salt, entropy)
758- if (((userTickets * numPrizes) > random))
766+ let random4 = getRandomNumber(M4, salt, entropy)
767+ if (isWin(userTickets, totalTickets, numPrizes, random4))
759768 then {
760- let issueResult = invoke(acres2Contract, "issuePickC1", [addr], nil)
769+ let rnd = getRandomNumber(100, (base58'29' + salt), entropy)
770+ let prizeResult = if ((rnd >= 90))
771+ then invoke(acres2Contract, "issuePickC1", [addr], nil)
772+ else invoke(acresContract, "sendAcresFor", [addr, 25000000], nil)
761773 let winners = getString(keyWeekWinners(drawWeek))
762774 let newWinners = if (isDefined(winners))
763775 then ((value(winners) + "_") + addr)
764776 else addr
765- $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], issueResult)
777+ $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], prizeResult)
766778 }
767779 else {
768780 let random1 = (getRandomNumber(9, (base58'29' + salt), entropy) + 1)
938950 then if ((size(i.payments) != 0))
939951 then throw("No payments required")
940952 else {
941- let $t01643916508 = claimInternal2(toString(i.caller))
942- let actions = $t01643916508._1
943- let wlgClaimedAmount = $t01643916508._2
953+ let $t01666316732 = claimInternal2(toString(i.caller))
954+ let actions = $t01666316732._1
955+ let wlgClaimedAmount = $t01666316732._2
944956 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
945957 }
946958 else throw("Strict value is not equal to itself.")
956968 else false)
957969 then throw("Permission denied")
958970 else {
959- let $t01682816885 = claimInternal2(addr)
960- if (($t01682816885 == $t01682816885))
971+ let $t01705217109 = claimInternal2(addr)
972+ if (($t01705217109 == $t01705217109))
961973 then {
962- let wlgClaimedAmount = $t01682816885._2
963- let actions = $t01682816885._1
974+ let wlgClaimedAmount = $t01705217109._2
975+ let actions = $t01705217109._1
964976 $Tuple2(if ((wlgClaimedAmount > 0))
965977 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
966978 else actions, wlgClaimedAmount)
978990 else false)
979991 then throw("Permission denied")
980992 else {
981- let $t01726817324 = claimInternal(addr)
982- if (($t01726817324 == $t01726817324))
993+ let $t01749217548 = claimInternal(addr)
994+ if (($t01749217548 == $t01749217548))
983995 then {
984- let wlgClaimedAmount = $t01726817324._2
985- let actions = $t01726817324._1
996+ let wlgClaimedAmount = $t01749217548._2
997+ let actions = $t01749217548._1
986998 $Tuple2(if ((wlgClaimedAmount > 0))
987999 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
9881000 else nil, wlgClaimedAmount)
10631075 func takeWlgXp (addr) = if ((i.caller != stakingContract))
10641076 then throw("Permission denied")
10651077 else {
1066- let $t01995619999 = takeXpInternal(addr, 0)
1067- let actions = $t01995619999._1
1068- let xp = $t01995619999._2
1078+ let $t02018020223 = takeXpInternal(addr, 0)
1079+ let actions = $t02018020223._1
1080+ let xp = $t02018020223._2
10691081 $Tuple2(actions, xp)
10701082 }
10711083
10731085
10741086 @Callable(i)
10751087 func checkWlgXpREADONLY (addr) = {
1076- let $t02007620124 = takeXpInternal(addr, 0)
1077- let ignored = $t02007620124._1
1078- let deltaXP = $t02007620124._2
1088+ let $t02030020348 = takeXpInternal(addr, 0)
1089+ let ignored = $t02030020348._1
1090+ let deltaXP = $t02030020348._2
10791091 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
10801092 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
10811093 $Tuple2(nil, (lvlPoints :+ newXP))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT8 = 100000000
99
1010 let MINSHOPPAYMENT = 100000
1111
1212 let DAY_MILLIS = 86400000
1313
1414 let chain = take(drop(this.bytes, 1), 1)
1515
1616 let DAY_BLOCKS = match chain {
1717 case _ =>
1818 if ((base58'2W' == $match0))
1919 then 1440
2020 else if ((base58'2T' == $match0))
2121 then 60
2222 else throw("Unknown chain")
2323 }
2424
2525 let WEEK_BLOCKS = match chain {
2626 case _ =>
2727 if ((base58'2W' == $match0))
2828 then 10080
2929 else if ((base58'2T' == $match0))
3030 then 180
3131 else throw("Unknown chain")
3232 }
3333
3434 let VRF_OFFSET = match chain {
3535 case _ =>
3636 if ((base58'2W' == $match0))
3737 then 0
3838 else if ((base58'2T' == $match0))
3939 then 1146000
4040 else throw("Unknown chain")
4141 }
4242
4343 let usdtAssetId = match chain {
4444 case _ =>
4545 if ((base58'2W' == $match0))
4646 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
4747 else if ((base58'2T' == $match0))
4848 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
4949 else throw("Unknown chain")
5050 }
5151
5252 let defaultRest2AddressStr = match chain {
5353 case _ =>
5454 if ((base58'2W' == $match0))
5555 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
5656 else if ((base58'2T' == $match0))
5757 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
5858 else throw("Unknown chain")
5959 }
6060
6161 let defaultRestAddressStr = match chain {
6262 case _ =>
6363 if ((base58'2W' == $match0))
6464 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
6565 else if ((base58'2T' == $match0))
6666 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
6767 else throw("Unknown chain")
6868 }
6969
7070 let economyContractStr = match chain {
7171 case _ =>
7272 if ((base58'2W' == $match0))
7373 then "3P2sk1KncSxRaZs8b4CWGPw2jkvvav74u4D"
7474 else if ((base58'2T' == $match0))
7575 then "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep"
7676 else throw("Unknown chain")
7777 }
7878
7979 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
8080
8181
8282 let IdxCfgAcres2Dapp = 1
8383
8484 let IdxCfgWlgDapp = 2
8585
8686 let IdxCfgPuzzlePoolDapp = 4
8787
8888 let IdxCfgInvestFundDapp = 5
8989
9090 let IdxCfgMarketDapp = 6
9191
9292 func keyRestCfg () = "%s__restConfig"
9393
9494
9595 func keyRest2Address () = "%s__rest2Addr"
9696
9797
9898 func keyRestAddress () = "%s__restAddr"
9999
100100
101101 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
102102
103103 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
104104
105105
106106 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
107107
108108
109109 let IdxCfgStakingDapp = 1
110110
111111 let IdxCfgAcresDapp = 8
112112
113113 let restCfg = readRestCfgOrFail(restContract)
114114
115115 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
116116
117117 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
118118
119119 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
120120
121121 let rest2Cfg = readRestCfgOrFail(rest2Contract)
122122
123123 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
124124
125125 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
126126
127127 let puzzlePoolContract = getContractAddressOrFail(rest2Cfg, IdxCfgPuzzlePoolDapp)
128128
129129 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
130130
131131 let marketContract = getContractAddressOrFail(rest2Cfg, IdxCfgMarketDapp)
132132
133133 func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
134134
135135
136136 let wlgAssetIdKey = "wlg_assetId"
137137
138138 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
139139
140140 func keyUserBet (addr) = ("userBet_" + addr)
141141
142142
143143 func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
144144
145145
146146 func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
147147
148148
149149 func keyTotalWeekParticipants (week) = ("totalWeekParticipants_" + toString(week))
150150
151151
152152 func keyNumNFT2Draw (week) = ("numNFT2Draw_" + toString(week))
153153
154154
155155 func keyNumNFTDrawn (week) = ("numNFTDrawn_" + toString(week))
156156
157157
158158 func keyWeekWinners (week) = ("weekWinners_" + toString(week))
159159
160160
161161 func winningBet (day) = {
162162 let b = (day * DAY_BLOCKS)
163163 let h = if ((b > VRF_OFFSET))
164164 then b
165165 else (b + VRF_OFFSET)
166166 (toInt(value(value(blockInfoByHeight(h)).vrf)) % 4)
167167 }
168168
169169
170170 let ixWlgAmount = 0
171171
172172 let ixWlgWlg = 1
173173
174174 let ixWlgPrice = 2
175175
176176 let ixWlgIssueTime = 8
177177
178178 let ixWlgTeamAmLeft = 11
179179
180180 let ixWlgTeamAmAvailNow = 12
181181
182182 let ixWlgActAmLeft = 15
183183
184184 let ixWlgActAmAvailNow = 16
185185
186186 let ixWlgAmLeftTotal = 19
187187
188188 let ixWlgUserAmAvailNow = 23
189189
190190 let ixWlgEffUserTime = 24
191191
192192 let ixWlgIssue10Amount = 25
193193
194194 let ixWlgMarketingIssue10Amount = 26
195195
196196 let ixWlgTeamIssue10Amount = 27
197197
198198 let ixWlgUser10part = 28
199199
200200 let ixWlgIssue10Time = 29
201201
202202 func asInt (v) = match v {
203203 case n: Int =>
204204 n
205205 case _ =>
206206 throw("fail to cast into Int")
207207 }
208208
209209
210210 func fixedPoint (val,decimals) = {
211211 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
212212 let lowPart = toString((val % tenPow))
213213 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
214214 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
215215 }
216216
217217
218218 func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
219219 then throw("maxValue should be > 0")
220220 else {
221221 let randomHash = sha256_16Kb((salt + entropy))
222222 (toInt(randomHash) % maxValue)
223223 }
224224
225225
226+let M4 = 10000
227+
226228 let SCALE8 = 100000000
227229
228230 let xpLevelScale = 3200
229231
230232 let xpLevelRecipPow = 4000
231233
232234 let numPointsOnLevelUp = 3
233235
234236 let wlgBaseAmountXp = 100000000000
235237
236238 func keyUserXP (addr) = ("userXP_" + addr)
237239
238240
239241 func keyUserLevel (addr) = ("userLevel_" + addr)
240242
241243
242244 let xpWlg = 10000
243245
244246 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
245247
246248
247249 func levelUp (currLevel,newXP) = {
248250 let newLevel = levelByXP(newXP)
249251 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
252+ }
253+
254+
255+func isWin (userTickets,totalTickets,numPrizes,random4) = {
256+ let a4 = fraction(M4, (totalTickets - userTickets), totalTickets)
257+ let p4 = pow(a4, 4, numPrizes, 0, 4, DOWN)
258+ ((M4 - random4) > p4)
250259 }
251260
252261
253262 let M6 = 1000000
254263
255264 let M8 = 100000000
256265
257266 let MILLION6 = 100000000000000
258267
259268 let TEAMSHARE = 200000
260269
261270 let ACTIVITYSHARE = 100000
262271
263272 let PLAYERSHARE = 400000
264273
265274 let YEARMILLIS = 31557600000
266275
267276 let DAYMILLIS = 86400000
268277
269278 let BANK_FEE = 50000
270279
271280 let ch = take(drop(this.bytes, 1), 1)
272281
273282 let USDT_TVL_CORRECTION = match ch {
274283 case _ =>
275284 if ((base58'2W' == $match0))
276285 then 1208630000
277286 else if ((base58'2T' == $match0))
278287 then 0
279288 else throw("Unknown chain")
280289 }
281290
282291 let teamAddrKey = "teamAddr"
283292
284293 let lastTeamTimeKey = "lastClaimedTime_team"
285294
286295 let teamAmountLeftKey = "teamAmountLeft"
287296
288297 let lastActivitiesTimeKey = "lastClaimedTime_activities"
289298
290299 let actAmountLeftKey = "activitiesAmountLeft"
291300
292301 let stakersAmountLeftKey = "stakersAmountLeft"
293302
294303 func keyLastClaimedTimeByUserOld (addr) = ("lastClaimedTimeUserOld_" + addr)
295304
296305
297306 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
298307
299308
300309 func keyLastWlgTradeLimitByUser (addr) = ("lastWlgLimitUser_" + addr)
301310
302311
303312 func distributionByPeriod (period) = fraction(MILLION6, (PLAYERSHARE * (period + 1)), (6 * M6))
304313
305314
306315 let wlgIssueTimeKey = "wlg_issueTime"
307316
308317 let wlgIssuedAmountKey = "wlg_issuedAmount"
309318
310319 let zbIssuedAmountKey = "zbill_issuedAmount"
311320
312321 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
313322
314323
315324 let acresStakedTotalKey = "acresStakedAmountTotal"
316325
317326 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
318327
319328
320329 let wlgStakedTotalKey = "wlgStakedAmountTotal"
321330
322331 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
323332
324333
325334 let dappRest = 0
326335
327336 let dappStaking = 1
328337
329338 let dappEconomy = 2
330339
331340 let dappWlg = 3
332341
333342 let dappPuzzle = 4
334343
335344 let dappInvestFund = 5
336345
337346 let dappAcres = 6
338347
339348 func getLands (userAddrStrOrEmpty,stakingContract,acresContract) = {
340349 let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
341350 func adder (acc,item) = (acc + parseIntValue(item))
342351
343352 let totalPieces = {
344353 let $l = props
345354 let $s = size($l)
346355 let $acc0 = 0
347356 func $f0_1 ($a,$i) = if (($i >= $s))
348357 then $a
349358 else adder($a, $l[$i])
350359
351360 func $f0_2 ($a,$i) = if (($i >= $s))
352361 then $a
353362 else throw("List size exceeds 6")
354363
355364 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
356365 }
357366 let userPieces = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
358367 let totalAcres = valueOrElse(getInteger(acresContract, acresStakedTotalKey), 0)
359368 let userAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddrStrOrEmpty)), 0)
360369 [totalPieces, userPieces, totalAcres, userAcres]
361370 }
362371
363372
364373 let idxTotalPieces = 0
365374
366375 let idxUserPieces = 1
367376
368377 let idxTotalAcres = 2
369378
370379 let idxUserAcres = 3
371380
372381 let OLD_STAKING_DEADL = 1733346000000
373382
374383 func getWlgStats (userAddrOpt,contracts,usdtId,usdtBalanceCorrection,userProportion6) = {
375384 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
376385 let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
377386 let restUsd = assetBalance(contracts[dappRest], usdtId)
378387 let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
379388 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
380389 let investFndContract = contracts[dappInvestFund]
381390 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmountKey), 0))
382391 let totalFundsUsd = ((economyUsd + wlgUsd) + investFundTotal)
383392 let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
384393 let now = lastBlock.timestamp
385394 let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
386395 let bankWlgold = assetBalance(contracts[dappStaking], wlgId)
387396 let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
388397 let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
389398 let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
390399 let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
391400 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
392401 let teamWlgold = assetBalance(teamAddr, wlgId)
393402 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
394403 let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
395404 let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
396405 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
397406 let actWlgold = assetBalance(contracts[dappRest], wlgId)
398407 let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUserOld(userAddrOpt)), issueTime)
399408 let lastUserPeriod = ((lastUserTime - issueTime) / YEARMILLIS)
400409 let nowLimited = min([min([now, (issueTime + (3 * YEARMILLIS))]), OLD_STAKING_DEADL])
401410 let curPeriod = min([((now - issueTime) / YEARMILLIS), 2])
402411 let eff = getLands(userAddrOpt, contracts[dappStaking], contracts[dappAcres])
403412 let curPeriodDistribution = distributionByPeriod(curPeriod)
404413 let $t079143 = if ((lastUserPeriod == curPeriod))
405414 then {
406415 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEARMILLIS)
407416 let userPart = fraction(a0, userProportion6, M6)
408417 let effTime = (lastUserTime + fraction((nowLimited - lastUserTime), userProportion6, M6))
409418 $Tuple3(userPart, a0, effTime)
410419 }
411420 else if ((lastUserPeriod == (curPeriod - 1)))
412421 then {
413422 let a1 = fraction(distributionByPeriod((curPeriod - 1)), ((issueTime + (YEARMILLIS * curPeriod)) - lastUserTime), YEARMILLIS)
414423 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
415424 let avail = (a1 + a0)
416425 let userPart = fraction(avail, userProportion6, M6)
417426 let effTime = if ((a1 >= userPart))
418427 then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 1))))
419428 else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, (userPart - a1), curPeriodDistribution))
420429 $Tuple3(userPart, avail, effTime)
421430 }
422431 else {
423432 let a2 = fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS)
424433 let a1 = distributionByPeriod((curPeriod - 1))
425434 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
426435 let avail = ((a2 + a1) + a0)
427436 let userPart = fraction(avail, userProportion6, M6)
428437 let effTime = if ((a2 >= userPart))
429438 then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 2))))
430439 else if (((a2 + a1) >= userPart))
431440 then ((issueTime + (YEARMILLIS * (curPeriod - 1))) + fraction(YEARMILLIS, (userPart - a2), distributionByPeriod((curPeriod - 1))))
432441 else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, ((userPart - a2) - a1), curPeriodDistribution))
433442 $Tuple3(userPart, avail, effTime)
434443 }
435444 let userAmount = $t079143._1
436445 let userAvailable = $t079143._2
437446 let effLastTime = $t079143._3
438447 let sLandDailyAmount = fraction(fraction(curPeriodDistribution, DAYMILLIS, YEARMILLIS), 25, eff[idxTotalPieces])
439448 let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
440449 let userTemp = fraction(userAmount, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
441450 let bankFromUser = fraction(userTemp, BANK_FEE, M6)
442451 let robbedUser = (userTemp - bankFromUser)
443452 let unrobbedUser = fraction(userAvailable, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
444453 [issuedAmount, fraction((totalFundsUsd - USDT_TVL_CORRECTION), M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, robbedUser, sLandDailyAmount, investFundTotal, unrobbedUser, effLastTime, bankWlgold]
445454 }
446455
447456
448457 let M6_ = 1000000
449458
450459 let M8_ = 100000000
451460
452461 let TEAM_SHARE = 200000
453462
454463 let ACTIVITY_SHARE = 100000
455464
456465 let PLAYER_SHARE = 400000
457466
458467 let YEAR_MILLIS = 31557600000
459468
460469 let DAY_MS = 86400000
461470
462471 let ISSUE10 = 1000000000
463472
464473 let PLAYERS10_SHARE = 800000
465474
466475 let MARKETING10_SHARE = 100000
467476
468477 let TEAM10_SHARE = 100000
469478
470479 let NEW_STAKING_START = 1731279600000
471480
472481 let marketingAddrKey = "marketingAddr"
473482
474483 let teamAdrKey = "teamAddr"
475484
476485 let lastTeamTimKey = "lastClaimedTime_team"
477486
478487 let teamAmtLeftKey = "teamAmountLeft"
479488
480489 let lastActivitiesTimKey = "lastClaimedTime_activities"
481490
482491 let actAmtLeftKey = "activitiesAmountLeft"
483492
484493 let stakersAmtLeftKey = "stakersAmountLeft"
485494
486495 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
487496
488497
489498 func distrByPeriod (issuedAmount,period) = fraction(issuedAmount, (PLAYER_SHARE * (period + 1)), (6 * M6_))
490499
491500
492501 let wlgIssue10TimeKey = "wlg_issue10Time"
493502
494503 let wlgIssueTimKey = "wlg_issueTime"
495504
496505 let wlgIssuedAmtKey = "wlg_issuedAmount"
497506
498507 let zbIssuedAmtKey = "zbill_issuedAmount"
499508
500509 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
501510
502511
503512 let acresStakdTotalKey = "acresStakedAmountTotal"
504513
505514 let totalFarmingPowerKey = "totalFarmingPower"
506515
507516 let dapp2Rest = 0
508517
509518 let dapp2Staking = 1
510519
511520 let dapp2Wlg = 2
512521
513522 let dapp2Puzzle = 3
514523
515524 let dapp2InvestFund = 4
516525
517526 let DEFAULT_WEEKLY_PRIZES = 5
518527
519528 let ACRES_FOR_BET = 100000000
520529
521530 let keyNftTotalIssued = "nftTotalIssued"
522531
523532 let keyNftTotalBurned = "nftTotalBurned"
524533
525534 let keyWlNftTotalStaked = "WlNftTotalStaked"
526535
527536 func keyUserWlNftNumber (addr) = ("userWlNftNumber_" + addr)
528537
529538
530539 func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
531540
532541
533542 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
534543
535544 func getLevelByAcres (acres) = {
536545 let acr = ((acres + 99999999) / M8_)
537546 func checker (acc,item) = if ((item >= acr))
538547 then acc
539548 else (acc + 1)
540549
541550 let $l = levelAcres
542551 let $s = size($l)
543552 let $acc0 = 0
544553 func $f0_1 ($a,$i) = if (($i >= $s))
545554 then $a
546555 else checker($a, $l[$i])
547556
548557 func $f0_2 ($a,$i) = if (($i >= $s))
549558 then $a
550559 else throw("List size exceeds 10")
551560
552561 $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)
553562 }
554563
555564
556565 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
557566
558567
559568 func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
560569 let notBonused = getFarmingPowerByAcres(acres)
561570 $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
562571 }
563572
564573
565574 func getFarmingPowers (userAddrStrOrEmpty,acres2Contract) = {
566575 let totalFP = valueOrElse(getInteger(acres2Contract, totalFarmingPowerKey), 0)
567576 let userAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
568577 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(userAddrStrOrEmpty)), 0)
569578 let $t079143 = getFarmingPowerByAcresAndBonus(userAcres, userBonus)
570579 let userFPbonused = $t079143._1
571580 let userFPnotBonused = $t079143._2
572581 [totalFP, userFPbonused, userFPnotBonused, userBonus]
573582 }
574583
575584
576585 let idxTotalFP = 0
577586
578587 let idxUserFPbonused = 1
579588
580589 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
581590 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
582591 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
583592 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
584593 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
585594 let acres2Usd = assetBalance(contracts[dapp2Staking], usdtId)
586595 let investFndContract = contracts[dapp2InvestFund]
587596 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
588597 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
589598 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
590599 let now = lastBlock.timestamp
591600 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
592601 let wlgWlg = assetBalance(contracts[dapp2Wlg], wlgId)
593602 let teamTotal = fraction(issuedAmount, TEAM_SHARE, M6_)
594603 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
595604 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
596605 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
597606 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
598607 let teamWlgold = assetBalance(teamAddr, wlgId)
599608 let actTotal = fraction(issuedAmount, ACTIVITY_SHARE, M6_)
600609 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
601610 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
602611 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
603612 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
604613 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
605614 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
606615 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
607616 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
608617 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
609618 let curPeriodDistribution = distrByPeriod(issuedAmount, curPeriod)
610619 let prevPeriodEnd = (issueTime + (YEAR_MILLIS * curPeriod))
611620 let prevPrevPeriodEnd = (issueTime + (YEAR_MILLIS * (curPeriod - 1)))
612621 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
613622 let userAvailable = if ((lastUserPeriod == curPeriod))
614623 then a0
615624 else if ((lastUserPeriod == (curPeriod - 1)))
616625 then {
617626 let a1 = fraction(distrByPeriod(issuedAmount, (curPeriod - 1)), (prevPeriodEnd - lastUserTime), YEAR_MILLIS)
618627 (a1 + a0)
619628 }
620629 else {
621630 let a2 = fraction(distrByPeriod(issuedAmount, (curPeriod - 2)), (prevPrevPeriodEnd - lastUserTime), YEAR_MILLIS)
622631 let a1 = distrByPeriod(issuedAmount, (curPeriod - 1))
623632 ((a2 + a1) + a0)
624633 }
625634 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
626635 let userAmount = if ((eff[idxTotalFP] != 0))
627636 then fraction(userAvailable, eff[idxUserFPbonused], eff[idxTotalFP])
628637 else 0
629638 let lastIssue10Time = valueOrElse(getInteger(contracts[dapp2Wlg], wlgIssue10TimeKey), NEW_STAKING_START)
630639 let issue10Amount = fraction(ISSUE10, max([(now - lastIssue10Time), 0]), DAY_MS)
631640 let marketingIssue10Amount = fraction(issue10Amount, MARKETING10_SHARE, M6_)
632641 let teamIssue10Amount = fraction(issue10Amount, TEAM10_SHARE, M6_)
633642 let user10Interval = max([(now - max([NEW_STAKING_START, lastUserTime])), 0])
634643 let user10part = if ((eff[idxTotalFP] != 0))
635644 then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFPbonused], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
636645 else 0
637646 let newIssue10Time = max([NEW_STAKING_START, now])
638647 let acresStakedTotal = valueOrElse(getInteger(contracts[dapp2Staking], acresStakdTotalKey), 0)
639648 let nftTotalIssued = valueOrElse(getInteger(contracts[dapp2Staking], keyNftTotalIssued), 0)
640649 let nftTotalBurned = valueOrElse(getInteger(contracts[dapp2Staking], keyNftTotalBurned), 0)
641650 let wlNftTotalStaked = valueOrElse(getInteger(contracts[dapp2Staking], keyWlNftTotalStaked), 0)
642651 let wlNftUserStaked = valueOrElse(getInteger(contracts[dapp2Staking], keyUserWlNftNumber(valueOrElse(userAddrOpt, ""))), 0)
643652 [issuedAmount, wlgWlg, fraction(totalFundsUsd, M8_, issuedAmount), totalFundsUsd, restUsd, acres2Usd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, investFundTotal, userAmount, nowLimited, issue10Amount, marketingIssue10Amount, teamIssue10Amount, user10part, newIssue10Time, eff[idxTotalFP], acresStakedTotal, nftTotalIssued, nftTotalBurned, wlNftTotalStaked, wlNftUserStaked]
644653 }
645654
646655
647656 let profitAddrKey = "profitAddr"
648657
649658 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
650659
651660 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
652661
653662
654663 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
655664
656665
657666 func getSwapLimitWlgold (addr) = {
658667 let lastTime = valueOrElse(getInteger(keyLastWlgTradeTimeByUser(addr)), 0)
659668 let defaultLimit = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
660669 let lastLimitLeft = valueOrElse(getInteger(keyLastWlgTradeLimitByUser(addr)), defaultLimit)
661670 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (lastBlock.timestamp - lastTime), DAY_MILLIS))
662671 min([currentLimit, defaultLimit])
663672 }
664673
665674
666675 let idxWlgTeamAmLeft = 10
667676
668677 let idxWlgTeamAmAvailNow = 11
669678
670679 let idxWlgActAmLeft = 14
671680
672681 let idxWlgActAmAvailNow = 15
673682
674683 let idxWlgAmLeftTotal = 18
675684
676685 let idxWlgUserTotalAvail = 24
677686
678687 let idxWlgEffUserTime = 25
679688
680689 func claimInternal (addr) = {
681690 let caller = addressFromStringValue(addr)
682691 let economyContract = addressFromStringValue(economyContractStr)
683692 let curStats = getWlgStats(addr, [restContract, stakingContract, economyContract, wlgContract, puzzlePoolContract, investFundContract, acresContract], usdtAssetId, 0, MULT6)
684693 let now = lastBlock.timestamp
685694 let teamAmountLeft = curStats[idxWlgTeamAmLeft]
686695 let teamAmount = curStats[idxWlgTeamAmAvailNow]
687696 let actAmountLeft = curStats[idxWlgActAmLeft]
688697 let actAmount = curStats[idxWlgActAmAvailNow]
689698 let userAmount = curStats[idxWlgUserTotalAvail]
690699 let userKey = keyStakersAmountPaidUser(addr)
691700 let userTotal = curStats[idxWlgUserTotalAvail]
692701 let userEffTime = curStats[idxWlgEffUserTime]
693702 $Tuple2([ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId), ScriptTransfer(restContract, actAmount, wlgAssetId), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userTotal)), IntegerEntry(stakersAmountLeftKey, (curStats[idxWlgAmLeftTotal] - userTotal)), IntegerEntry(teamAmountLeftKey, (teamAmountLeft - teamAmount)), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(keyLastClaimedTimeByUserOld(addr), userEffTime)], userAmount)
694703 }
695704
696705
697706 func claimInternal2 (addr) = {
698707 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
699708 let userTimeKey = keyLastClaimTimeByUser(addr)
700709 let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
701710 let userEffTime = curStats[ixWlgEffUserTime]
702711 if ((lastUserTime == userEffTime))
703712 then $Tuple2(nil, 0)
704713 else {
705714 let now = lastBlock.timestamp
706715 let issueTime = curStats[ixWlgIssueTime]
707716 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
708717 let teamAmount = (curStats[ixWlgTeamAmAvailNow] + curStats[ixWlgTeamIssue10Amount])
709718 let teamActions = if ((teamAmount > 0))
710719 then [IntegerEntry(teamAmountLeftKey, ((teamAmountLeft - teamAmount) + curStats[ixWlgTeamIssue10Amount])), IntegerEntry(lastTeamTimeKey, now), ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
711720 else nil
712721 let actAmountLeft = curStats[ixWlgActAmLeft]
713722 let actAmount = curStats[ixWlgActAmAvailNow]
714723 let actActions = if ((actAmount > 0))
715724 then [IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), ScriptTransfer(restContract, actAmount, wlgAssetId)]
716725 else nil
717726 let marketingAmount = curStats[ixWlgMarketingIssue10Amount]
718727 let marketingTransfer = if ((marketingAmount > 0))
719728 then [ScriptTransfer(addressFromStringValue(value(getString(marketingAddrKey))), marketingAmount, wlgAssetId)]
720729 else nil
721730 let userAmount = curStats[ixWlgUserAmAvailNow]
722731 let userKey = keyStakersAmountPaidUser(addr)
723732 let userTotal = (userAmount + curStats[ixWlgUser10part])
724733 let issued10Amount = curStats[ixWlgIssue10Amount]
725734 $Tuple2(((([Reissue(wlgAssetId, issued10Amount, true), IntegerEntry(wlgIssuedAmountKey, (curStats[ixWlgAmount] + issued10Amount)), IntegerEntry(wlgIssue10TimeKey, curStats[ixWlgIssue10Time]), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userAmount)), IntegerEntry(userTimeKey, userEffTime)] ++ teamActions) ++ actActions) ++ marketingTransfer), userTotal)
726735 }
727736 }
728737
729738
730739 func takeXpInternal (addr,delta) = {
731740 let now = lastBlock.timestamp
732741 let timeKey = keyWlgStakedTimeByUser(addr)
733742 let amountKey = keyWlgStakedAmountByUser(addr)
734743 let lastTime = valueOrElse(getInteger(timeKey), 0)
735744 let oldUser = valueOrElse(getInteger(amountKey), 0)
736745 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
737746 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
738747 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
739748 }
740749
741750
742751 func openChestInternal (addr) = {
743752 let week = (height / WEEK_BLOCKS)
744753 let drawWeek = (week - 1)
745754 let numPrizes = valueOrElse(getInteger(keyNumNFT2Draw(drawWeek)), DEFAULT_WEEKLY_PRIZES)
746755 let prizesDrawn = valueOrElse(getInteger(keyNumNFTDrawn(drawWeek)), 0)
747756 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
748757 if ((0 >= userTickets))
749758 then $Tuple2(nil, unit)
750759 else {
751- let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
752- if ((0 >= weekTickets))
760+ let totalTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
761+ if ((0 >= totalTickets))
753762 then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
754763 else {
755764 let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
756765 let salt = fromBase58String(split(valueOrElse(getString(acres2Contract, keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
757- let random = getRandomNumber(weekTickets, salt, entropy)
758- if (((userTickets * numPrizes) > random))
766+ let random4 = getRandomNumber(M4, salt, entropy)
767+ if (isWin(userTickets, totalTickets, numPrizes, random4))
759768 then {
760- let issueResult = invoke(acres2Contract, "issuePickC1", [addr], nil)
769+ let rnd = getRandomNumber(100, (base58'29' + salt), entropy)
770+ let prizeResult = if ((rnd >= 90))
771+ then invoke(acres2Contract, "issuePickC1", [addr], nil)
772+ else invoke(acresContract, "sendAcresFor", [addr, 25000000], nil)
761773 let winners = getString(keyWeekWinners(drawWeek))
762774 let newWinners = if (isDefined(winners))
763775 then ((value(winners) + "_") + addr)
764776 else addr
765- $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], issueResult)
777+ $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], prizeResult)
766778 }
767779 else {
768780 let random1 = (getRandomNumber(9, (base58'29' + salt), entropy) + 1)
769781 let consTickets = fraction(userTickets, random1, 10)
770782 let ticketsKey = keyUserWeekTickets(addr, week)
771783 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
772784 $Tuple2(((if ((consTickets == 0))
773785 then nil
774786 else {
775787 let commonActions = [IntegerEntry(keyTotalWeekTickets(week), (valueOrElse(getInteger(keyTotalWeekTickets(week)), 0) + consTickets)), IntegerEntry(ticketsKey, (oldTickets + consTickets))]
776788 if ((oldTickets > 0))
777789 then commonActions
778790 else (commonActions :+ IntegerEntry(keyTotalWeekParticipants(week), (valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0) + 1)))
779791 }) :+ DeleteEntry(keyUserWeekTickets(addr, drawWeek))), consTickets)
780792 }
781793 }
782794 }
783795 }
784796
785797
786798 func claimTicketsInternal (addr,userBetStr) = {
787799 let week = (height / WEEK_BLOCKS)
788800 let ticketsKey = keyUserWeekTickets(addr, week)
789801 let dayBet = split(userBetStr, "_")
790802 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
791803 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
792804 let deltaTickets = if ((winningBet(parseIntValue(dayBet[0])) == parseIntValue(dayBet[1])))
793805 then 1
794806 else 0
795807 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
796808 let updateParticipants = if (if ((oldTickets == 0))
797809 then (deltaTickets == 1)
798810 else false)
799811 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
800812 else nil
801813 $Tuple2(if ((deltaTickets == 0))
802814 then nil
803815 else ((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
804816 }
805817
806818
807819 @Callable(i)
808820 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
809821 then throw("Permission denied")
810822 else if (isDefined(getBinary(wlgAssetIdKey)))
811823 then throw("Already initialized")
812824 else {
813825 let issuedAmount = MILLION6
814826 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
815827 let assetId = calculateAssetId(issue)
816828 [issue, IntegerEntry(wlgIssueTimeKey, lastBlock.timestamp), IntegerEntry(wlgIssuedAmountKey, issuedAmount), IntegerEntry(stakersAmountPaidTotalKey, 0), IntegerEntry(stakersAmountLeftKey, fraction(MILLION6, PLAYERSHARE, MULT6)), BinaryEntry(wlgAssetIdKey, assetId), StringEntry(keyRestAddress(), restAddr), StringEntry(marketingAddrKey, marketingAddr), StringEntry(teamAddrKey, teamAddr), StringEntry(profitAddrKey, profitAddr)]
817829 }
818830
819831
820832
821833 @Callable(i)
822834 func constructorV2 (rest2Addr) = if ((i.caller != this))
823835 then throw("Permission denied")
824836 else [StringEntry(keyRest2Address(), rest2Addr)]
825837
826838
827839
828840 @Callable(i)
829841 func buyWlg (minToReceive) = {
830842 let prologResult = prolog2()
831843 if ((prologResult == prologResult))
832844 then if ((size(i.payments) != 1))
833845 then throw("exactly 1 payment must be attached")
834846 else {
835847 let pmt = i.payments[0]
836848 let usdtAmt = pmt.amount
837849 if (if (!(isDefined(pmt.assetId)))
838850 then true
839851 else (value(pmt.assetId) != usdtAssetId))
840852 then throw("USDT payments only!")
841853 else {
842854 let caller = i.caller
843855 let addr = toString(caller)
844856 if ((MINSHOPPAYMENT > usdtAmt))
845857 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
846858 else {
847859 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
848860 let curWlgAmount = curStats[ixWlgAmount]
849861 let wlgPrice = curStats[ixWlgPrice]
850862 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
851863 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
852864 let maxWlg = getSwapLimitWlgold(addr)
853865 if ((wlgAmount > maxWlg))
854866 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
855867 else if ((minToReceive > wlgAmount))
856868 then throw("Price changed during operation, please try again")
857869 else {
858870 let profitAmount = (usdtAmt / 6)
859871 $Tuple2([Reissue(wlgAssetId, wlgAmount, true), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount + wlgAmount)), IntegerEntry(keyLastWlgTradeTimeByUser(addr), lastBlock.timestamp), IntegerEntry(keyLastWlgTradeLimitByUser(addr), (maxWlg - wlgAmount)), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, wlgAmount, wlgAssetId)], prologResult)
860872 }
861873 }
862874 }
863875 }
864876 else throw("Strict value is not equal to itself.")
865877 }
866878
867879
868880
869881 @Callable(i)
870882 func buyWlgREADONLY (address,usdtAmt) = {
871883 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
872884 let wlgPrice = curStats[ixWlgPrice]
873885 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
874886 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
875887 let maxWlg = getSwapLimitWlgold(address)
876888 let maxUsdt = fraction(maxWlg, buyPrice, MULT8)
877889 let profitAmount = (usdtAmt / 6)
878890 $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxUsdt, profitAmount])
879891 }
880892
881893
882894
883895 @Callable(i)
884896 func sellWlg (minAmount) = {
885897 let prologResult = prolog2()
886898 if ((prologResult == prologResult))
887899 then if ((size(i.payments) != 1))
888900 then throw("exactly 1 payment must be attached")
889901 else {
890902 let pmt = i.payments[0]
891903 let wlgAmt = pmt.amount
892904 let caller = i.caller
893905 let addr = toString(caller)
894906 let maxWlg = getSwapLimitWlgold(addr)
895907 if ((wlgAmt > maxWlg))
896908 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
897909 else if (if (!(isDefined(pmt.assetId)))
898910 then true
899911 else (value(pmt.assetId) != wlgAssetId))
900912 then throw("WLGOLD payments only!")
901913 else {
902914 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
903915 let curWlgAmount = curStats[ixWlgAmount]
904916 let sellPrice = (curStats[ixWlgPrice] / 2)
905917 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
906918 if ((MINSHOPPAYMENT > usdtAmt))
907919 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
908920 else if ((minAmount > usdtAmt))
909921 then throw("Price changed during operation, please try again")
910922 else {
911923 let profitAmount = (usdtAmt / 5)
912924 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount - wlgAmt)), IntegerEntry(keyLastWlgTradeTimeByUser(addr), lastBlock.timestamp), IntegerEntry(keyLastWlgTradeLimitByUser(addr), (maxWlg - wlgAmt)), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, usdtAmt, usdtAssetId)], prologResult)
913925 }
914926 }
915927 }
916928 else throw("Strict value is not equal to itself.")
917929 }
918930
919931
920932
921933 @Callable(i)
922934 func sellWlgREADONLY (address,wlgAmt) = {
923935 let maxWlg = getSwapLimitWlgold(address)
924936 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
925937 let sellPrice = (curStats[ixWlgPrice] / 2)
926938 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
927939 let minWlg = fraction(MINSHOPPAYMENT, MULT8, sellPrice)
928940 let profitAmount = (usdtAmt / 5)
929941 $Tuple2(nil, [usdtAmt, minWlg, maxWlg, profitAmount])
930942 }
931943
932944
933945
934946 @Callable(i)
935947 func claim () = {
936948 let prologResult = prolog2()
937949 if ((prologResult == prologResult))
938950 then if ((size(i.payments) != 0))
939951 then throw("No payments required")
940952 else {
941- let $t01643916508 = claimInternal2(toString(i.caller))
942- let actions = $t01643916508._1
943- let wlgClaimedAmount = $t01643916508._2
953+ let $t01666316732 = claimInternal2(toString(i.caller))
954+ let actions = $t01666316732._1
955+ let wlgClaimedAmount = $t01666316732._2
944956 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
945957 }
946958 else throw("Strict value is not equal to itself.")
947959 }
948960
949961
950962
951963 @Callable(i)
952964 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
953965 then (i.caller != acresContract)
954966 else false)
955967 then (i.caller != acres2Contract)
956968 else false)
957969 then throw("Permission denied")
958970 else {
959- let $t01682816885 = claimInternal2(addr)
960- if (($t01682816885 == $t01682816885))
971+ let $t01705217109 = claimInternal2(addr)
972+ if (($t01705217109 == $t01705217109))
961973 then {
962- let wlgClaimedAmount = $t01682816885._2
963- let actions = $t01682816885._1
974+ let wlgClaimedAmount = $t01705217109._2
975+ let actions = $t01705217109._1
964976 $Tuple2(if ((wlgClaimedAmount > 0))
965977 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
966978 else actions, wlgClaimedAmount)
967979 }
968980 else throw("Strict value is not equal to itself.")
969981 }
970982
971983
972984
973985 @Callable(i)
974986 func onStakeUnstakeLandOld (addr) = if (if (if ((i.caller != stakingContract))
975987 then (i.caller != acresContract)
976988 else false)
977989 then (i.caller != acres2Contract)
978990 else false)
979991 then throw("Permission denied")
980992 else {
981- let $t01726817324 = claimInternal(addr)
982- if (($t01726817324 == $t01726817324))
993+ let $t01749217548 = claimInternal(addr)
994+ if (($t01749217548 == $t01749217548))
983995 then {
984- let wlgClaimedAmount = $t01726817324._2
985- let actions = $t01726817324._1
996+ let wlgClaimedAmount = $t01749217548._2
997+ let actions = $t01749217548._1
986998 $Tuple2(if ((wlgClaimedAmount > 0))
987999 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
9881000 else nil, wlgClaimedAmount)
9891001 }
9901002 else throw("Strict value is not equal to itself.")
9911003 }
9921004
9931005
9941006
9951007 @Callable(i)
9961008 func burnWlgold (wlgAmt) = if (if ((i.caller != acres2Contract))
9971009 then (i.caller != marketContract)
9981010 else false)
9991011 then throw("Permission denied")
10001012 else {
10011013 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
10021014 if ((wlgAmt > curStats[ixWlgWlg]))
10031015 then throw(((("Only " + fixedPoint(curStats[ixWlgWlg], 8)) + " WLGOLD left on contract, can't burn ") + fixedPoint(wlgAmt, 8)))
10041016 else {
10051017 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
10061018 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
10071019 }
10081020 }
10091021
10101022
10111023
10121024 @Callable(i)
10131025 func betForTicket (bet) = {
10141026 let prologResult = prolog2()
10151027 if ((prologResult == prologResult))
10161028 then if ((size(i.payments) != 0))
10171029 then throw("No payments required")
10181030 else {
10191031 let addr = toString(i.caller)
10201032 let drawWeek = ((height / WEEK_BLOCKS) - 1)
10211033 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
10221034 let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
10231035 if (if ((userTickets > 0))
10241036 then (weekTickets > 0)
10251037 else false)
10261038 then throw("Please open the chest first")
10271039 else if (((bet / 4) != 0))
10281040 then throw("Invalid bet: should be 0..3")
10291041 else {
10301042 let moment = (height % DAY_BLOCKS)
10311043 if ((moment > (DAY_BLOCKS - 3)))
10321044 then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
10331045 else {
10341046 let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
10351047 if ((ACRES_FOR_BET > stakedAcres))
10361048 then throw((("You need to stake at least " + fixedPoint(ACRES_FOR_BET, 8)) + " ACRES to bet"))
10371049 else {
10381050 let tomorrow = ((height / DAY_BLOCKS) + 1)
10391051 let betKey = keyUserBet(addr)
10401052 let oldUserBetStr = getString(betKey)
10411053 let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
10421054 if (isDefined(oldUserBetStr))
10431055 then {
10441056 let userBet = value(oldUserBetStr)
10451057 if ((split(userBet, "_")[0] == toString(tomorrow)))
10461058 then throw("You already bet for tomorrow")
10471059 else {
10481060 let r = claimTicketsInternal(addr, userBet)
10491061 $Tuple2((r._1 :+ newBetEntry), r._2)
10501062 }
10511063 }
10521064 else $Tuple2([newBetEntry], 0)
10531065 }
10541066 }
10551067 }
10561068 }
10571069 else throw("Strict value is not equal to itself.")
10581070 }
10591071
10601072
10611073
10621074 @Callable(i)
10631075 func takeWlgXp (addr) = if ((i.caller != stakingContract))
10641076 then throw("Permission denied")
10651077 else {
1066- let $t01995619999 = takeXpInternal(addr, 0)
1067- let actions = $t01995619999._1
1068- let xp = $t01995619999._2
1078+ let $t02018020223 = takeXpInternal(addr, 0)
1079+ let actions = $t02018020223._1
1080+ let xp = $t02018020223._2
10691081 $Tuple2(actions, xp)
10701082 }
10711083
10721084
10731085
10741086 @Callable(i)
10751087 func checkWlgXpREADONLY (addr) = {
1076- let $t02007620124 = takeXpInternal(addr, 0)
1077- let ignored = $t02007620124._1
1078- let deltaXP = $t02007620124._2
1088+ let $t02030020348 = takeXpInternal(addr, 0)
1089+ let ignored = $t02030020348._1
1090+ let deltaXP = $t02030020348._2
10791091 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
10801092 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
10811093 $Tuple2(nil, (lvlPoints :+ newXP))
10821094 }
10831095
10841096
10851097
10861098 @Callable(i)
10871099 func setNumPrizes (numPrizes) = if ((i.caller != this))
10881100 then throw("Permission denied")
10891101 else {
10901102 let week = (height / WEEK_BLOCKS)
10911103 $Tuple2([IntegerEntry(keyNumNFT2Draw(week), numPrizes)], numPrizes)
10921104 }
10931105
10941106
10951107
10961108 @Callable(i)
10971109 func openChest () = {
10981110 let prologResult = prolog2()
10991111 if ((prologResult == prologResult))
11001112 then if ((size(i.payments) != 0))
11011113 then throw("No payments required")
11021114 else {
11031115 let drawWeek = ((height / WEEK_BLOCKS) - 1)
11041116 let addr = toString(i.caller)
11051117 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
11061118 if ((0 >= userTickets))
11071119 then throw("No gems to open the chest")
11081120 else openChestInternal(addr)
11091121 }
11101122 else throw("Strict value is not equal to itself.")
11111123 }
11121124
11131125
11141126
11151127 @Callable(i)
11161128 func addGemsFor (addr,deltaTickets) = if ((i.caller != this))
11171129 then throw("Permission denied")
11181130 else {
11191131 let week = (height / WEEK_BLOCKS)
11201132 let ticketsKey = keyUserWeekTickets(addr, week)
11211133 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
11221134 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
11231135 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
11241136 let updateParticipants = if (if ((oldTickets == 0))
11251137 then (deltaTickets == 1)
11261138 else false)
11271139 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
11281140 else nil
11291141 $Tuple2(((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
11301142 }
11311143
11321144

github/deemru/w8io/169f3d6 
364.32 ms