tx · Ask62ZaThJG2MrccVRnR7n1ku45Lu4epyPNCBWBZVEZW

3Mrq917T9DgxmZHP2wBRURvA2jUseEGaMqW:  -0.02200000 Waves

2024.11.27 21:04 [3390164] smart account 3Mrq917T9DgxmZHP2wBRURvA2jUseEGaMqW > SELF 0.00000000 Waves

{ "type": 13, "id": "Ask62ZaThJG2MrccVRnR7n1ku45Lu4epyPNCBWBZVEZW", "fee": 2200000, "feeAssetId": null, "timestamp": 1732730645091, "version": 2, "chainId": 84, "sender": "3Mrq917T9DgxmZHP2wBRURvA2jUseEGaMqW", "senderPublicKey": "GCo4ZuX1Rm35x7nEMaxmHnkUeRoPqRk9knR7Ga55tMkD", "proofs": [ "3o9oTw13wW614XFhZKF7dpPjnHDhJQenZJ7esD4y3wzmeVrqCRq4sDvcTq17YQ4imUUstChpYVzw8SVR1iUFEKVa" ], "script": "base64:BgIcCAISAwoBCBIDCgEIEgMKAQgSAwoBCBIECgIICDIBCWlzVGVzdEVudgAEB3Rlc3RlbnYEByRtYXRjaDAJAJsIAgUEdGhpcwIHVEVTVEVOVgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAF4BQckbWF0Y2gwBQF4BwUHdGVzdGVudgEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAEMdHJ5R2V0U3RyaW5nAQNrZXkJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIFBHRoaXMFA2tleQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQACAQkArAICAilSQUk6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQsIGJ1dCBnb3Q6IAUGc3RyaW5nCQACAQIeUkFJOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQlhc0Jvb2xlYW4BBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAdib29sZWFuBQckbWF0Y2gwBQdib29sZWFuCQACAQIiRkFCOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogQm9vbGVhbgEIYXNTdHJpbmcBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMDCQABAgUHJG1hdGNoMAIDSW50BAFzBQckbWF0Y2gwCQACAQImd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IFN0cmluZywgZ290OiBJbnQDCQABAgUHJG1hdGNoMAIEVW5pdAQBcwUHJG1hdGNoMAkAAgECJ3dyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogVW5pdAkAAgECHHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBFHN0YXRpY0tleV9lZ2dBc3NldElkAAIRc3RhdGljX2VnZ0Fzc2V0SWQBFXN0YXRpY0tleV9idXJuQWRkcmVzcwACEnN0YXRpY19idXJuQWRkcmVzcwESc3RhdGljS2V5X2V4dHJhRmVlAAIPc3RhdGljX2V4dHJhRmVlARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgACFHN0YXRpY19mZWVBZ2dyZWdhdG9yASBzdGF0aWNLZXlfdHVydGxlSW5jdWJhdG9yQWRkcmVzcwACHXN0YXRpY190dXJ0bGVJbmN1YmF0b3JBZGRyZXNzAR5zdGF0aWNLZXlfdHVydGxlQnJlZWRlckFkZHJlc3MAAhtzdGF0aWNfdHVydGxlQnJlZWRlckFkZHJlc3MBFnN0YXRpY0tleV9zcGljZUFzc2V0SWQAAhNzdGF0aWNfc3BpY2VBc3NldElkARxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAIZc3RhdGljX3JlZkNvbnRyYWN0QWRkcmVzcwEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAIVc3RhdGljX2NvdXBvbnNBZGRyZXNzAR5zdGF0aWNLZXlfdHVydGxlU3Rha2luZ0FkZHJlc3MAAhtzdGF0aWNfdHVydGxlU3Rha2luZ0FkZHJlc3MBHHN0YXRpY0tleV9kdWNrU3Rha2luZ0FkZHJlc3MAAhhzdGF0aWNfZmFybWluZ0FkZHJlc3NOZXcBHnN0YXRpY0tleV9kdWNrSW5jdWJhdG9yQWRkcmVzcwACF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzARZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAITc3RhdGljX2l0ZW1zQWRkcmVzcwEhc3RhdGljS2V5X3R1cnRsZVNwaWNlUmViaXJ0aFByaWNlAAIec3RhdGljX3R1cnRsZVNwaWNlUmViaXJ0aFByaWNlASFzdGF0aWNLZXlfdHVydGxlV2F2ZXNSZWJpcnRoUHJpY2UAAh5zdGF0aWNfdHVydGxlV2F2ZXNSZWJpcnRoUHJpY2UBH3N0YXRpY0tleV90dXJ0bGVFZ2dSZWJpcnRoUHJpY2UAAhxzdGF0aWNfdHVydGxlRWdnUmViaXJ0aFByaWNlAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAQ5nZXRCdXJuQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY0tleV9idXJuQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABF2dldFR1cnRsZUJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X3R1cnRsZUJyZWVkZXJBZGRyZXNzAAEZZ2V0VHVydGxlSW5jdWJhdG9yQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBIHN0YXRpY0tleV90dXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAEPZ2V0U3BpY2VBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9zcGljZUFzc2V0SWQAARVnZXRSZWZDb250cmFjdEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAERZ2V0Q291cG9uc0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAARdnZXRUdXJ0bGVTdGFraW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV90dXJ0bGVTdGFraW5nQWRkcmVzcwABFWdldER1Y2tTdGFraW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHHN0YXRpY0tleV9kdWNrU3Rha2luZ0FkZHJlc3MAARdnZXREdWNrSW5jdWJhdG9yQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV9kdWNrSW5jdWJhdG9yQWRkcmVzcwABD2dldEl0ZW1zQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCaCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIJAAIBAhpUUjogVmFsdWUgbm90IGZvdW5kIGluIHNjIQEJY2hlY2tSZWFsAQdhc3NldElkAwMJAAACCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgkBF2dldFR1cnRsZUJyZWVkZXJBZGRyZXNzAAYJAAACCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgkBGWdldFR1cnRsZUluY3ViYXRvckFkZHJlc3MACAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgkAAgECDW5vdCB2YWxpZCBORlQAC3NwaWNlQW1vdW50CQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgkBCWdldE9yYWNsZQAJASFzdGF0aWNLZXlfdHVydGxlU3BpY2VSZWJpcnRoUHJpY2UAAAllZ2dBbW91bnQJARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBH3N0YXRpY0tleV90dXJ0bGVFZ2dSZWJpcnRoUHJpY2UAAAt3YXZlc0Ftb3VudAkBFXRyeUdldEludGVnZXJFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEhc3RhdGljS2V5X3R1cnRsZVdhdmVzUmViaXJ0aFByaWNlAAAQZGVsYXlGb3JIYXRjaGluZwACAQ9jaGVja1JlYWxUdXJ0bGUBB2Fzc2V0SWQDAwkAAAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQEXZ2V0VHVydGxlQnJlZWRlckFkZHJlc3MABgkAAAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQEZZ2V0VHVydGxlSW5jdWJhdG9yQWRkcmVzcwAGCQACAQINbm90IHZhbGlkIE5GVAEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZUkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxSQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsAQ9nZXRSYW5kb21OdW1iZXIEB29wdGlvbnMEdHhJZBRoYXRjaGluZ0ZpbmlzaEhlaWdodAZvZmZzZXQED3JhbmRvbVNlZWRCbG9jawkBBXZhbHVlAQkA7QcBCQBlAgUUaGF0Y2hpbmdGaW5pc2hIZWlnaHQAAQQKcmFuZG9tSGFzaAkA9wMBCQDLAQIFBHR4SWQJAQV2YWx1ZQEIBQ9yYW5kb21TZWVkQmxvY2sDdnJmCQBqAgkAsgkCBQpyYW5kb21IYXNoCQBoAgUGb2Zmc2V0AAgFB29wdGlvbnMBDXRyeUdldEJvb2xlYW4BA2tleQQHJG1hdGNoMAkAoAgBBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBDGdldFJhbmRvbVdpbgMCdHgMZmluaXNoSGVpZ2h0DWJsYWNrbGlzdENvZGUEDmphY2twb3RFbmFibGVkCQENdHJ5R2V0Qm9vbGVhbgECD0pBQ0tQT1RfRU5BQkxFRAQNamFja3BvdFJhbmRvbQkBD2dldFJhbmRvbU51bWJlcgQArAIFAnR4BQxmaW5pc2hIZWlnaHQAAQMDCQAAAgUNamFja3BvdFJhbmRvbQABBQ5qYWNrcG90RW5hYmxlZAcJAJQKAgUNamFja3BvdFJhbmRvbQIHamFja3BvdAQBbgkBD2dldFJhbmRvbU51bWJlcgQA6AcFAnR4BQxmaW5pc2hIZWlnaHQAAAQGcmVzdWx0AwMJAGYCACgFAW4JAQIhPQICFGl0ZW0hQVJULUZJUkVfU0hJRUxEBQ1ibGFja2xpc3RDb2RlBwIUaXRlbSFBUlQtRklSRV9TSElFTEQDAwkAZgIAUAUBbgkBAiE9AgISaXRlbSFBUlQtRklSRV9UQUlMBQ1ibGFja2xpc3RDb2RlBwISaXRlbSFBUlQtRklSRV9UQUlMAwMJAGYCAGQFAW4JAQIhPQICEWl0ZW0hQVJULUZSRUVHRU5FBQ1ibGFja2xpc3RDb2RlBwIRaXRlbSFBUlQtRlJFRUdFTkUDAwkAZgIAlgEFAW4JAQIhPQICB2JlYWNoX1IFDWJsYWNrbGlzdENvZGUHAgdiZWFjaF9SAwMJAGYCAMgBBQFuCQECIT0CAgdiZWFjaF9TBQ1ibGFja2xpc3RDb2RlBwIHYmVhY2hfUwMDCQBmAgD6AQUBbgkBAiE9AgIHYmVhY2hfRwUNYmxhY2tsaXN0Q29kZQcCB2JlYWNoX0cDAwkAZgIArAIFAW4JAQIhPQICB2JlYWNoX0QFDWJsYWNrbGlzdENvZGUHAgdiZWFjaF9EAwMJAGYCAPwCBQFuCQECIT0CAhNpdGVtIUFSVC1NVVRBUklVTS1HBQ1ibGFja2xpc3RDb2RlBwITaXRlbSFBUlQtTVVUQVJJVU0tRwMDCQBmAgCQAwUBbgkBAiE9AgIOaXRlbSFBUlQtRkVFRDUFDWJsYWNrbGlzdENvZGUHAg5pdGVtIUFSVC1GRUVENQMDCQBmAgDYBAUBbgkBAiE9AgIPaXRlbSFBUlQtRkVFRDEwBQ1ibGFja2xpc3RDb2RlBwIPaXRlbSFBUlQtRkVFRDEwAwMJAGYCAOwEBQFuCQECIT0CAg9pdGVtIUFSVC1GRUVEMTUFDWJsYWNrbGlzdENvZGUHAg9pdGVtIUFSVC1GRUVEMTUDAwkAZgIAgAUFAW4JAQIhPQICD2l0ZW0hQVJULUZFRUQyMAUNYmxhY2tsaXN0Q29kZQcCD2l0ZW0hQVJULUZFRUQyMAMDCQBmAgCUBQUBbgkBAiE9AgIPaXRlbSFBUlQtRkVFRDI1BQ1ibGFja2xpc3RDb2RlBwIPaXRlbSFBUlQtRkVFRDI1AwMJAGYCAKgFBQFuCQECIT0CAg9pdGVtIUFSVC1GRUVENTAFDWJsYWNrbGlzdENvZGUHAg9pdGVtIUFSVC1GRUVENTADAwkAZgIA+AUFAW4JAQIhPQICEGl0ZW0hQVJULUZFRUQxMDAFDWJsYWNrbGlzdENvZGUHAhBpdGVtIUFSVC1GRUVEMTAwAwMJAGYCAIwGBQFuCQECIT0CAgdwZXJjaF9HBQ1ibGFja2xpc3RDb2RlBwIHcGVyY2hfRwMDCQBmAgCgBgUBbgkBAiE9AgIHcGVyY2hfWQUNYmxhY2tsaXN0Q29kZQcCB3BlcmNoX1kDAwkAZgIAtAYFAW4JAQIhPQICB3BlcmNoX1IFDWJsYWNrbGlzdENvZGUHAgdwZXJjaF9SAwMJAGYCAMgGBQFuCQECIT0CAgdwZXJjaF9CBQ1ibGFja2xpc3RDb2RlBwIHcGVyY2hfQgMDCQBmAgDwBgUBbgkBAiE9AgITaXRlbSFBUlQtTVVUQVJJVU0tRAUNYmxhY2tsaXN0Q29kZQcCE2l0ZW0hQVJULU1VVEFSSVVNLUQDAwkAZgIArAcFAW4JAQIhPQICCWluY3ViYXRvcgUNYmxhY2tsaXN0Q29kZQcCCWluY3ViYXRvcgIOZHVja19pbmN1YmF0b3IJAJQKAgUBbgUGcmVzdWx0AQ9nZXRSYW5kb21SZXR1cm4CAnR4DGZpbmlzaEhlaWdodAQBbgkBD2dldFJhbmRvbU51bWJlcgQAAgUCdHgFDGZpbmlzaEhlaWdodAABAwkAAAIFAW4AAAYHARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBmluaXRUeAdhZGRyZXNzEWFkZGl0aW9uYWxQYXltZW50BmRvdWJsZQ1ibGFja2xpc3RDb2RlBnJlc2N1ZQQLZmluaXNoQmxvY2sJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIMX2ZpbmlzaEJsb2NrBAZzdGF0dXMJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4Agdfc3RhdHVzBAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQURYWRkaXRpb25hbFBheW1lbnQDCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEDHJlY29yZEFjdGlvbgkA/AcECQERZ2V0Q291cG9uc0FkZHJlc3MAAgxyZWNvcmRBY3Rpb24JAMwIAgINUkVCSVJUSFRVUlRMRQUDbmlsBQNuaWwDCQAAAgUMcmVjb3JkQWN0aW9uBQxyZWNvcmRBY3Rpb24DCQECIT0CBQZzdGF0dXMCBG9wZW4JAAIBAh9yZWJpcnRoIGlzIGZpbmlzaGVkIG9yIG5vdCBvcGVuAwkAZgIFC2ZpbmlzaEJsb2NrBQZoZWlnaHQJAAIBAh55b3UgY2Fubm90IGZpbmlzaCByZWJpcnRoLCB5ZXQEBm91dHB1dAkBDGdldFJhbmRvbVdpbgMJANkEAQUGaW5pdFR4BQtmaW5pc2hCbG9jawUNYmxhY2tsaXN0Q29kZQQDd2luCAUGb3V0cHV0Al8yBAZyYW5kb20IBQZvdXRwdXQCXzEEBHR4SWQFBmluaXRUeAQGcmVzdWx0AwkBAiE9AgkAswkCBQN3aW4CBXBlcmNoBQR1bml0BAVjb2xvcgkAsgICBQN3aW4AAQQEY2FsbAMJAQEhAQUGZG91YmxlBAVmaXJzdAkA/AcECQEVZ2V0RHVja1N0YWtpbmdBZGRyZXNzAAIMYWRkRnJlZVBlcmNoCQDMCAIFB2FkZHJlc3MJAMwIAgUFY29sb3IJAMwIAgABBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFZmlyc3QJAPwHBAkBFWdldER1Y2tTdGFraW5nQWRkcmVzcwACDGFkZEZyZWVQZXJjaAkAzAgCBQdhZGRyZXNzCQDMCAIFBWNvbG9yCQDMCAIAAgUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9yZXN1bHQxCQEIYXNTdHJpbmcBBQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgVfd2luMQUDd2luBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUEY2FsbAUEY2FsbAUEY2FsbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAQIhPQIJALMJAgUDd2luAgViZWFjaAUEdW5pdAQFY29sb3IJALICAgUDd2luAAEEBGNhbGwDCQEBIQEFBmRvdWJsZQQFZmlyc3QJAPwHBAkBF2dldFR1cnRsZVN0YWtpbmdBZGRyZXNzAAIMYWRkRnJlZUJlYWNoCQDMCAIFB2FkZHJlc3MJAMwIAgUFY29sb3IFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAVmaXJzdAkA/AcECQEXZ2V0VHVydGxlU3Rha2luZ0FkZHJlc3MAAgxhZGRGcmVlQmVhY2gJAMwIAgUHYWRkcmVzcwkAzAgCBQVjb2xvcgUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0BAZzZWNvbmQJAPwHBAkBF2dldFR1cnRsZVN0YWtpbmdBZGRyZXNzAAIMYWRkRnJlZUJlYWNoCQDMCAIFB2FkZHJlc3MJAMwIAgUFY29sb3IFA25pbAUDbmlsAwkAAAIFBnNlY29uZAUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9yZXN1bHQxCQEIYXNTdHJpbmcBBQZzZWNvbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIFX3dpbjEFA3dpbgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBGNhbGwFBGNhbGwFBGNhbGwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUDd2luAgdqYWNrcG90BARjYWxsCQD8BwQJARlnZXRUdXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAIMaXNzdWVKYWNrcG90CQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAkAzAgCCQELdmFsdWVPckVsc2UCCQCiCAECDEpBQ0tQT1RfTkFNRQIIV1dXV1hNQVMFA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUEY2FsbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFA3dpbgIJaW5jdWJhdG9yBARjYWxsAwkBASEBBQZkb3VibGUEBWZpcnN0CQD8BwQJARlnZXRUdXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAIPaXNzdWVGcmVlVHVydGxlCQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBWZpcnN0CQD8BwQJARlnZXRUdXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAIPaXNzdWVGcmVlVHVydGxlCQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0BAZzZWNvbmQJAPwHBAkBF2dldER1Y2tJbmN1YmF0b3JBZGRyZXNzAAIZaXNzdWVGcmVlRHVja0RlZmluZWRHZW5lcwkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQJAMwIAgIIWlpaWlpaWloFA25pbAUDbmlsAwkAAAIFBnNlY29uZAUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9yZXN1bHQxCQEIYXNTdHJpbmcBBQZzZWNvbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIFX3dpbjECDmR1Y2tfaW5jdWJhdG9yBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUEY2FsbAUEY2FsbAUEY2FsbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQN3aW4CDmR1Y2tfaW5jdWJhdG9yBARjYWxsAwkBASEBBQZkb3VibGUEBWZpcnN0CQD8BwQJARdnZXREdWNrSW5jdWJhdG9yQWRkcmVzcwACGWlzc3VlRnJlZUR1Y2tEZWZpbmVkR2VuZXMJAMwIAgUHYWRkcmVzcwkAzAgCBQR0eElkCQDMCAICCFpaWlpaWlpaBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFZmlyc3QJAPwHBAkBF2dldER1Y2tJbmN1YmF0b3JBZGRyZXNzAAIZaXNzdWVGcmVlRHVja0RlZmluZWRHZW5lcwkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQJAMwIAgIIWlpaWlpaWloFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAQGc2Vjb25kCQD8BwQJARlnZXRUdXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAIPaXNzdWVGcmVlVHVydGxlCQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAUDbmlsBQNuaWwDCQAAAgUGc2Vjb25kBQZzZWNvbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIIX3Jlc3VsdDEJAQhhc1N0cmluZwEFBnNlY29uZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgVfd2luMQIJaW5jdWJhdG9yBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUEY2FsbAUEY2FsbAUEY2FsbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAQIhPQIJALMJAgUDd2luAgRpdGVtBQR1bml0BAhpdGVtTmFtZQkAkQMCCQC1CQIFA3dpbgIBIQABBARjYWxsAwkBASEBBQZkb3VibGUEBWZpcnN0CQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhJpc3N1ZUFydGVmYWN0SW5kZXgJAMwIAgUIaXRlbU5hbWUJAMwIAgUHYWRkcmVzcwkAzAgCAAAFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAVmaXJzdAkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAISaXNzdWVBcnRlZmFjdEluZGV4CQDMCAIFCGl0ZW1OYW1lCQDMCAIFB2FkZHJlc3MJAMwIAgAABQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QEBnNlY29uZAkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAISaXNzdWVBcnRlZmFjdEluZGV4CQDMCAIFCGl0ZW1OYW1lCQDMCAIFB2FkZHJlc3MJAMwIAgABBQNuaWwFA25pbAMJAAACBQZzZWNvbmQFBnNlY29uZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfcmVzdWx0MQkBCGFzU3RyaW5nAQUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCBV93aW4xBQN3aW4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQRjYWxsBQRjYWxsBQRjYWxsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIzUkZCOiBTb21lIGVycm9yIG9jY3VyZWQsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbnMhBA5yZXR1cm5Ub1NlbmRlcgMFBnJlc2N1ZQkBD2dldFJhbmRvbVJldHVybgIJANkEAQUGaW5pdFR4BQtmaW5pc2hCbG9jawcEDXJldHVyblBheWxvYWQDBQ5yZXR1cm5Ub1NlbmRlcgQHYXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfYXNzZXRJZAQGaXNzdWVyCQEJY2hlY2tSZWFsAQUHYXNzZXRJZAQDZ2VuCQEIYXNTdHJpbmcBCQD8BwQJARdnZXRUdXJ0bGVCcmVlZGVyQWRkcmVzcwACDmdldEdlbkZyb21OYW1lCQDMCAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEbmFtZQUDbmlsBQNuaWwDCQAAAgUDZ2VuBQNnZW4EBGNhbGwJAPwHBAUGaXNzdWVyAg5pbmNyZWFzZVJhcml0eQkAzAgCCQDYBAEFB2Fzc2V0SWQJAMwIAgUDZ2VuBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB2FkZHJlc3MAAQUHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAM4IAgkAzggCBQZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIEX3dpbgUDd2luCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19zdGF0dXMCBmZpbmlzaAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3JhbmRvbQUGcmFuZG9tBQNuaWwFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg9SQ1U6IGFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIUc3RhdGljX29yYWNsZUFkZHJlc3MFBm9yYWNsZQUDbmlsAWkBC2luaXRSZWJpcnRoAQ5yZWZlcmVyQWRkcmVzcwQJcG10VHVydGxlCQCRAwIIBQFpCHBheW1lbnRzAAAECHBtdFdhdmVzCQCRAwIIBQFpCHBheW1lbnRzAAEECHBtdFNwaWNlCQCRAwIIBQFpCHBheW1lbnRzAAIEB2Fzc2V0SWQJAQV2YWx1ZQEIBQlwbXRUdXJ0bGUHYXNzZXRJZAQGaW5pdFR4CQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AggFCXBtdFR1cnRsZQZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQDAwkBAiE9AggFCHBtdFdhdmVzBmFtb3VudAULd2F2ZXNBbW91bnQGCQECIT0CCAUIcG10V2F2ZXMHYXNzZXRJZAUEdW5pdAkAAgECJldhdmVzcGF5bWVudCBpcyBub3QgYXR0YWNoZWQgb3Igd3JvbmchAwMJAQIhPQIIBQhwbXRTcGljZQZhbW91bnQFC3NwaWNlQW1vdW50BgkBAiE9AggFCHBtdFNwaWNlB2Fzc2V0SWQJAQ9nZXRTcGljZUFzc2V0SWQACQACAQImU3BpY2VQYXltZW50IGlzIG5vdCBhdHRhY2hlZCBvciB3cm9uZyEEE2Ftb3VudFBhaWRCeUNvdXBvbnMJAQVhc0ludAEJAPwHBAkBEWdldENvdXBvbnNBZGRyZXNzAAIKdXNlQ291cG9ucwkAzAgCBQllZ2dBbW91bnQFA25pbAUDbmlsAwkAAAIFE2Ftb3VudFBhaWRCeUNvdXBvbnMFE2Ftb3VudFBhaWRCeUNvdXBvbnMECWxlZnRUb1BheQkAZQIFCWVnZ0Ftb3VudAUTYW1vdW50UGFpZEJ5Q291cG9ucwQFdG9wdXAJAPwHBAkBF2dldFR1cnRsZVN0YWtpbmdBZGRyZXNzAAILdG9wVXBSZXdhcmQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBD2dldFNwaWNlQXNzZXRJZAAIBQhwbXRTcGljZQZhbW91bnQFA25pbAMJAAACBQV0b3B1cAUFdG9wdXAEB3BheW1lbnQDCQECIT0CBQlsZWZ0VG9QYXkAAAQGcG10RWdnCQCRAwIIBQFpCHBheW1lbnRzAAMECmZlZVBheW1lbnQJAQV2YWx1ZQEFBnBtdEVnZwMJAQIhPQIIBQpmZWVQYXltZW50B2Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAkAAgECJFlvdSBuZWVkIHRvIGF0dGFjaCBFR0cgdG9rZW5zIGFzIGZlZQMJAQIhPQIIBQpmZWVQYXltZW50BmFtb3VudAUJbGVmdFRvUGF5CQACAQkArAICAkBZb3UgbmVlZCB0byBhdHRhY2ggdGhlIGZvbGxvd2luZyBhbW91bnQgb2YgRUdHIHRva2VucyBhcyBmZWU6IDAuCQCkAwEFCWxlZnRUb1BheQQVcmVmZXJlclJld2FyZEZvclBlcmNoCQBrAwUJbGVmdFRvUGF5AAUAZAQHcmVmQ2FsbAkBCWFzQm9vbGVhbgEJAPwHBAkBFWdldFJlZkNvbnRyYWN0QWRkcmVzcwACCnJlZlBheW1lbnQJAMwIAgUOcmVmZXJlckFkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFA25pbAMJAAACBQdyZWZDYWxsBQdyZWZDYWxsBAZ0b0J1cm4DBQdyZWZDYWxsCQBlAgUJbGVmdFRvUGF5BRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFCWxlZnRUb1BheQQIYnVybkNhbGwJAPwHBAkBDmdldEJ1cm5BZGRyZXNzAAIUYnVybkF0dGFjaGVkUGF5bWVudHMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABQZ0b0J1cm4FA25pbAMJAAACBQhidXJuQ2FsbAUIYnVybkNhbGwFCWxlZnRUb1BheQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAwkAAAIFB3BheW1lbnQFB3BheW1lbnQECnJlYWxUdXJ0bGUJAQ9jaGVja1JlYWxUdXJ0bGUBBQdhc3NldElkAwkAAAIFCnJlYWxUdXJ0bGUFCnJlYWxUdXJ0bGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCDF9maW5pc2hCbG9jawkAZAIFBmhlaWdodAUQZGVsYXlGb3JIYXRjaGluZwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4Agdfc3RhdHVzAgRvcGVuCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9hc3NldElkCQDYBAEFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IACAUIcG10V2F2ZXMGYW1vdW50BQR1bml0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENZmluaXNoUmViaXJ0aAEGaW5pdFR4CQEVZmluaXNoUmViaXJ0aEludGVybmFsBgUGaW5pdFR4CQClCAEIBQFpBmNhbGxlcgkAkQMCCAUBaQhwYXltZW50cwAABwIABwFpARNmaW5pc2hSZWJpcnRoRG91YmxlAQZpbml0VHgDCQEBIQEDCQAAAgkAkAMBCAUBaQhwYXltZW50cwACCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQcJAAIBAg9JbnZhbGlkIHBheW1lbnQEB2Fzc2V0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLYm9vc3RlclR5cGUJAQhhc1N0cmluZwEJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgULYm9vc3RlclR5cGUFC2Jvb3N0ZXJUeXBlAwkAAAIFC2Jvb3N0ZXJUeXBlAg5BUlQtR0lGVF9ET1VCTAkAzggCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABBQNuaWwJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAEGAgAHCQACAQItRXJyb3IhIFdyb25nIGl0ZW0gYXR0YWNoZWQgdG8gZG91YmxlIHJld2FyZHMhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWZpbmlzaFJlYmlydGhJdGVtAgZpbml0VHgIaXRlbUNvZGUDAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEHBAdhc3NldElkCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEC2Jvb3N0ZXJUeXBlCQEIYXNTdHJpbmcBCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAwkAAAIFC2Jvb3N0ZXJUeXBlBQtib29zdGVyVHlwZQMJAAACBQtib29zdGVyVHlwZQILQVJULUhXRVJBU0UJAM4IAgkAzAgCCQEEQnVybgIFB2Fzc2V0SWQAAQUDbmlsCQEVZmluaXNoUmViaXJ0aEludGVybmFsBgUGaW5pdFR4CQClCAEIBQFpBmNhbGxlcgkAkQMCCAUBaQhwYXltZW50cwABBwUIaXRlbUNvZGUHAwkAAAIFC2Jvb3N0ZXJUeXBlAgxBUlQtSFdSRVNDVUUJAM4IAgkAzAgCCQEEQnVybgIFB2Fzc2V0SWQAAQUDbmlsCQEVZmluaXNoUmViaXJ0aEludGVybmFsBgUGaW5pdFR4CQClCAEIBQFpBmNhbGxlcgkAkQMCCAUBaQhwYXltZW50cwABBwIABgMJAAACBQtib29zdGVyVHlwZQIOQVJULUdJRlRfRE9VQkwJAM4IAgkAzAgCCQEEQnVybgIFB2Fzc2V0SWQAAQUDbmlsCQEVZmluaXNoUmViaXJ0aEludGVybmFsBgUGaW5pdFR4CQClCAEIBQFpBmNhbGxlcgkAkQMCCAUBaQhwYXltZW50cwABBgIABwkAAgECG0Vycm9yISBXcm9uZyBpdGVtIGF0dGFjaGVkIAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAAHAgAHCQACAQIQSW52YWxpZCBwYXltZW50cwECdHgBBnZlcmlmeQADCQEJaXNUZXN0RW52AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQJZmlyc3RVc2VyASBRHOT9Zv8SadLxWhSfO7Li9Dt/wctoJ6I0Xmw411fdbQQKc2Vjb25kVXNlcgEgXHIOS67xIU9m5hlF+mqise2xNilZXxnMzLDhTUGIan0ECXRoaXJkVXNlcgEgoK+R5S15Q2FhMhKtjrn6GFlRnS1TSTbD0KP3qGAZO04ED2ZpcnN0VXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQlmaXJzdFVzZXIAAQAABBBzZWNvbmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUKc2Vjb25kVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUKc2Vjb25kVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUKc2Vjb25kVXNlcgABAAAED3RoaXJkVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQl0aGlyZFVzZXIAAQAABA9zaWduYXR1cmVzQ291bnQJAGQCCQBkAgUPZmlyc3RVc2VyU2lnbmVkBRBzZWNvbmRVc2VyU2lnbmVkBQ90aGlyZFVzZXJTaWduZWQEByRtYXRjaDAFAnR4CQBnAgUPc2lnbmF0dXJlc0NvdW50AAI0Wbgt", "height": 3390164, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4qnvd5jc68qCzE3m3VbxDxJDGKqjQHAMhhnWi4P9KuXn Next: none Diff:
OldNewDifferences
159159 }
160160
161161
162+func checkReal (assetId) = if (if ((value(assetInfo(assetId)).issuer == getTurtleBreederAddress()))
163+ then true
164+ else (value(assetInfo(assetId)).issuer == getTurtleIncubatorAddress()))
165+ then value(assetInfo(assetId)).issuer
166+ else throw("not valid NFT")
167+
168+
162169 let spiceAmount = tryGetIntegerExternal(getOracle(), staticKey_turtleSpiceRebirthPrice())
163170
164171 let eggAmount = tryGetIntegerExternal(getOracle(), staticKey_turtleEggRebirthPrice())
199206 }
200207
201208
202-func getRandomWin (tx,finishHeight) = {
209+func getRandomWin (tx,finishHeight,blacklistCode) = {
203210 let jackpotEnabled = tryGetBoolean("JACKPOT_ENABLED")
204211 let jackpotRandom = getRandomNumber(300, tx, finishHeight, 1)
205212 if (if ((jackpotRandom == 1))
208215 then $Tuple2(jackpotRandom, "jackpot")
209216 else {
210217 let n = getRandomNumber(1000, tx, finishHeight, 0)
211- let result = if ((40 > n))
218+ let result = if (if ((40 > n))
219+ then ("item!ART-FIRE_SHIELD" != blacklistCode)
220+ else false)
212221 then "item!ART-FIRE_SHIELD"
213- else if ((80 > n))
222+ else if (if ((80 > n))
223+ then ("item!ART-FIRE_TAIL" != blacklistCode)
224+ else false)
214225 then "item!ART-FIRE_TAIL"
215- else if ((100 > n))
226+ else if (if ((100 > n))
227+ then ("item!ART-FREEGENE" != blacklistCode)
228+ else false)
216229 then "item!ART-FREEGENE"
217- else if ((150 > n))
230+ else if (if ((150 > n))
231+ then ("beach_R" != blacklistCode)
232+ else false)
218233 then "beach_R"
219- else if ((200 > n))
234+ else if (if ((200 > n))
235+ then ("beach_S" != blacklistCode)
236+ else false)
220237 then "beach_S"
221- else if ((250 > n))
238+ else if (if ((250 > n))
239+ then ("beach_G" != blacklistCode)
240+ else false)
222241 then "beach_G"
223- else if ((300 > n))
242+ else if (if ((300 > n))
243+ then ("beach_D" != blacklistCode)
244+ else false)
224245 then "beach_D"
225- else if ((380 > n))
246+ else if (if ((380 > n))
247+ then ("item!ART-MUTARIUM-G" != blacklistCode)
248+ else false)
226249 then "item!ART-MUTARIUM-G"
227- else if ((400 > n))
250+ else if (if ((400 > n))
251+ then ("item!ART-FEED5" != blacklistCode)
252+ else false)
228253 then "item!ART-FEED5"
229- else if ((600 > n))
254+ else if (if ((600 > n))
255+ then ("item!ART-FEED10" != blacklistCode)
256+ else false)
230257 then "item!ART-FEED10"
231- else if ((620 > n))
258+ else if (if ((620 > n))
259+ then ("item!ART-FEED15" != blacklistCode)
260+ else false)
232261 then "item!ART-FEED15"
233- else if ((640 > n))
262+ else if (if ((640 > n))
263+ then ("item!ART-FEED20" != blacklistCode)
264+ else false)
234265 then "item!ART-FEED20"
235- else if ((660 > n))
266+ else if (if ((660 > n))
267+ then ("item!ART-FEED25" != blacklistCode)
268+ else false)
236269 then "item!ART-FEED25"
237- else if ((680 > n))
270+ else if (if ((680 > n))
271+ then ("item!ART-FEED50" != blacklistCode)
272+ else false)
238273 then "item!ART-FEED50"
239- else if ((760 > n))
274+ else if (if ((760 > n))
275+ then ("item!ART-FEED100" != blacklistCode)
276+ else false)
240277 then "item!ART-FEED100"
241- else if ((780 > n))
278+ else if (if ((780 > n))
279+ then ("perch_G" != blacklistCode)
280+ else false)
242281 then "perch_G"
243- else if ((800 > n))
282+ else if (if ((800 > n))
283+ then ("perch_Y" != blacklistCode)
284+ else false)
244285 then "perch_Y"
245- else if ((820 > n))
286+ else if (if ((820 > n))
287+ then ("perch_R" != blacklistCode)
288+ else false)
246289 then "perch_R"
247- else if ((840 > n))
290+ else if (if ((840 > n))
291+ then ("perch_B" != blacklistCode)
292+ else false)
248293 then "perch_B"
249- else if ((880 > n))
294+ else if (if ((880 > n))
295+ then ("item!ART-MUTARIUM-D" != blacklistCode)
296+ else false)
250297 then "item!ART-MUTARIUM-D"
251- else if ((940 > n))
298+ else if (if ((940 > n))
299+ then ("incubator" != blacklistCode)
300+ else false)
252301 then "incubator"
253302 else "duck_incubator"
254303 $Tuple2(n, result)
256305 }
257306
258307
259-func finishRebirthInternal (initTx,address,additionalPayment,double) = {
308+func getRandomReturn (tx,finishHeight) = {
309+ let n = getRandomNumber(2, tx, finishHeight, 1)
310+ if ((n == 0))
311+ then true
312+ else false
313+ }
314+
315+
316+func finishRebirthInternal (initTx,address,additionalPayment,double,blacklistCode,rescue) = {
260317 let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
261318 let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
262319 let validPayment = checkAdditionalPayment(additionalPayment)
269326 else if ((finishBlock > height))
270327 then throw("you cannot finish rebirth, yet")
271328 else {
272- let output = getRandomWin(fromBase58String(initTx), finishBlock)
329+ let output = getRandomWin(fromBase58String(initTx), finishBlock, blacklistCode)
273330 let win = output._2
274331 let random = output._1
275332 let txId = initTx
399456 else throw("Strict value is not equal to itself.")
400457 }
401458 else throw("RFB: Some error occured, please contact the admins!")
459+ let returnToSender = if (rescue)
460+ then getRandomReturn(fromBase58String(initTx), finishBlock)
461+ else false
462+ let returnPayload = if (returnToSender)
463+ then {
464+ let assetId = fromBase58String(getStringValue((((("address_" + address) + "_initTx_") + initTx) + "_assetId")))
465+ let issuer = checkReal(assetId)
466+ let gen = asString(invoke(getTurtleBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
467+ if ((gen == gen))
468+ then {
469+ let call = invoke(issuer, "increaseRarity", [toBase58String(assetId), gen], nil)
470+ if ((call == call))
471+ then [ScriptTransfer(addressFromStringValue(address), 1, assetId)]
472+ else throw("Strict value is not equal to itself.")
473+ }
474+ else throw("Strict value is not equal to itself.")
475+ }
476+ else nil
402477 ((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_random"), random)]) ++ validPayment)
403478 }
404479 else throw("Strict value is not equal to itself.")
483558
484559
485560 @Callable(i)
486-func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false)
561+func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
487562
488563
489564
497572 let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
498573 if ((boosterType == boosterType))
499574 then if ((boosterType == "ART-GIFT_DOUBL"))
500- then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true))
575+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
501576 else throw("Error! Wrong item attached to double rewards!")
502577 else throw("Strict value is not equal to itself.")
503578 }
579+
580+
581+
582+@Callable(i)
583+func finishRebirthItem (initTx,itemCode) = if (if ((size(i.payments) == 2))
584+ then (i.payments[0].amount == 1)
585+ else false)
586+ then {
587+ let assetId = value(i.payments[0].assetId)
588+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
589+ if ((boosterType == boosterType))
590+ then if ((boosterType == "ART-HWERASE"))
591+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, itemCode, false))
592+ else if ((boosterType == "ART-HWRESCUE"))
593+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, "", true))
594+ else if ((boosterType == "ART-GIFT_DOUBL"))
595+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
596+ else throw("Error! Wrong item attached ")
597+ else throw("Strict value is not equal to itself.")
598+ }
599+ else if ((size(i.payments) == 1))
600+ then finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
601+ else throw("Invalid payments")
504602
505603
506604 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func isTestEnv () = {
55 let testenv = match getBoolean(this, "TESTENV") {
66 case x: Boolean =>
77 x
88 case _ =>
99 false
1010 }
1111 testenv
1212 }
1313
1414
1515 func tryGetStringExternal (address,key) = match getString(address, key) {
1616 case a: String =>
1717 a
1818 case _ =>
1919 ""
2020 }
2121
2222
2323 func tryGetInteger (key) = match getInteger(this, key) {
2424 case b: Int =>
2525 b
2626 case _ =>
2727 0
2828 }
2929
3030
3131 func tryGetString (key) = tryGetStringExternal(this, key)
3232
3333
3434 func asInt (value) = match value {
3535 case int: Int =>
3636 int
3737 case string: String =>
3838 throw(("RAI: wrong type, expected: Int, but got: " + string))
3939 case _ =>
4040 throw("RAI: wrong type, expected: Int")
4141 }
4242
4343
4444 func asBoolean (value) = match value {
4545 case boolean: Boolean =>
4646 boolean
4747 case _ =>
4848 throw("FAB: wrong type, expected: Boolean")
4949 }
5050
5151
5252 func asString (value) = match value {
5353 case s: String =>
5454 s
5555 case s: Int =>
5656 throw("wrong type, expected: String, got: Int")
5757 case s: Unit =>
5858 throw("wrong type, expected: String, got: Unit")
5959 case _ =>
6060 throw("wrong type, expected: String")
6161 }
6262
6363
6464 func staticKey_oracleAddress () = "static_oracleAddress"
6565
6666
6767 func staticKey_eggAssetId () = "static_eggAssetId"
6868
6969
7070 func staticKey_burnAddress () = "static_burnAddress"
7171
7272
7373 func staticKey_extraFee () = "static_extraFee"
7474
7575
7676 func staticKey_feeAggregator () = "static_feeAggregator"
7777
7878
7979 func staticKey_turtleIncubatorAddress () = "static_turtleIncubatorAddress"
8080
8181
8282 func staticKey_turtleBreederAddress () = "static_turtleBreederAddress"
8383
8484
8585 func staticKey_spiceAssetId () = "static_spiceAssetId"
8686
8787
8888 func staticKey_refContractAddress () = "static_refContractAddress"
8989
9090
9191 func staticKey_couponsAddress () = "static_couponsAddress"
9292
9393
9494 func staticKey_turtleStakingAddress () = "static_turtleStakingAddress"
9595
9696
9797 func staticKey_duckStakingAddress () = "static_farmingAddressNew"
9898
9999
100100 func staticKey_duckIncubatorAddress () = "static_incubatorAddress"
101101
102102
103103 func staticKey_itemsAddress () = "static_itemsAddress"
104104
105105
106106 func staticKey_turtleSpiceRebirthPrice () = "static_turtleSpiceRebirthPrice"
107107
108108
109109 func staticKey_turtleWavesRebirthPrice () = "static_turtleWavesRebirthPrice"
110110
111111
112112 func staticKey_turtleEggRebirthPrice () = "static_turtleEggRebirthPrice"
113113
114114
115115 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
116116
117117
118118 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
119119
120120
121121 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
122122
123123
124124 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
125125
126126
127127 func getTurtleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleBreederAddress())))
128128
129129
130130 func getTurtleIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleIncubatorAddress())))
131131
132132
133133 func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
134134
135135
136136 func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
137137
138138
139139 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
140140
141141
142142 func getTurtleStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleStakingAddress())))
143143
144144
145145 func getDuckStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckStakingAddress())))
146146
147147
148148 func getDuckIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckIncubatorAddress())))
149149
150150
151151 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
152152
153153
154154 func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
155155 case b: Int =>
156156 b
157157 case _ =>
158158 throw("TR: Value not found in sc!")
159159 }
160160
161161
162+func checkReal (assetId) = if (if ((value(assetInfo(assetId)).issuer == getTurtleBreederAddress()))
163+ then true
164+ else (value(assetInfo(assetId)).issuer == getTurtleIncubatorAddress()))
165+ then value(assetInfo(assetId)).issuer
166+ else throw("not valid NFT")
167+
168+
162169 let spiceAmount = tryGetIntegerExternal(getOracle(), staticKey_turtleSpiceRebirthPrice())
163170
164171 let eggAmount = tryGetIntegerExternal(getOracle(), staticKey_turtleEggRebirthPrice())
165172
166173 let wavesAmount = tryGetIntegerExternal(getOracle(), staticKey_turtleWavesRebirthPrice())
167174
168175 let delayForHatching = 2
169176
170177 func checkRealTurtle (assetId) = if (if ((value(assetInfo(assetId)).issuer == getTurtleBreederAddress()))
171178 then true
172179 else (value(assetInfo(assetId)).issuer == getTurtleIncubatorAddress()))
173180 then true
174181 else throw("not valid NFT")
175182
176183
177184 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
178185 then throw("RCAP: Please attach waves")
179186 else {
180187 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
181188 if ((payment.amount != feeAmount))
182189 then throw((("RCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
183190 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
184191 }
185192
186193
187194 func getRandomNumber (options,txId,hatchingFinishHeight,offset) = {
188195 let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
189196 let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
190197 (toInt(randomHash, (offset * 8)) % options)
191198 }
192199
193200
194201 func tryGetBoolean (key) = match getBoolean(key) {
195202 case b: Boolean =>
196203 b
197204 case _ =>
198205 false
199206 }
200207
201208
202-func getRandomWin (tx,finishHeight) = {
209+func getRandomWin (tx,finishHeight,blacklistCode) = {
203210 let jackpotEnabled = tryGetBoolean("JACKPOT_ENABLED")
204211 let jackpotRandom = getRandomNumber(300, tx, finishHeight, 1)
205212 if (if ((jackpotRandom == 1))
206213 then jackpotEnabled
207214 else false)
208215 then $Tuple2(jackpotRandom, "jackpot")
209216 else {
210217 let n = getRandomNumber(1000, tx, finishHeight, 0)
211- let result = if ((40 > n))
218+ let result = if (if ((40 > n))
219+ then ("item!ART-FIRE_SHIELD" != blacklistCode)
220+ else false)
212221 then "item!ART-FIRE_SHIELD"
213- else if ((80 > n))
222+ else if (if ((80 > n))
223+ then ("item!ART-FIRE_TAIL" != blacklistCode)
224+ else false)
214225 then "item!ART-FIRE_TAIL"
215- else if ((100 > n))
226+ else if (if ((100 > n))
227+ then ("item!ART-FREEGENE" != blacklistCode)
228+ else false)
216229 then "item!ART-FREEGENE"
217- else if ((150 > n))
230+ else if (if ((150 > n))
231+ then ("beach_R" != blacklistCode)
232+ else false)
218233 then "beach_R"
219- else if ((200 > n))
234+ else if (if ((200 > n))
235+ then ("beach_S" != blacklistCode)
236+ else false)
220237 then "beach_S"
221- else if ((250 > n))
238+ else if (if ((250 > n))
239+ then ("beach_G" != blacklistCode)
240+ else false)
222241 then "beach_G"
223- else if ((300 > n))
242+ else if (if ((300 > n))
243+ then ("beach_D" != blacklistCode)
244+ else false)
224245 then "beach_D"
225- else if ((380 > n))
246+ else if (if ((380 > n))
247+ then ("item!ART-MUTARIUM-G" != blacklistCode)
248+ else false)
226249 then "item!ART-MUTARIUM-G"
227- else if ((400 > n))
250+ else if (if ((400 > n))
251+ then ("item!ART-FEED5" != blacklistCode)
252+ else false)
228253 then "item!ART-FEED5"
229- else if ((600 > n))
254+ else if (if ((600 > n))
255+ then ("item!ART-FEED10" != blacklistCode)
256+ else false)
230257 then "item!ART-FEED10"
231- else if ((620 > n))
258+ else if (if ((620 > n))
259+ then ("item!ART-FEED15" != blacklistCode)
260+ else false)
232261 then "item!ART-FEED15"
233- else if ((640 > n))
262+ else if (if ((640 > n))
263+ then ("item!ART-FEED20" != blacklistCode)
264+ else false)
234265 then "item!ART-FEED20"
235- else if ((660 > n))
266+ else if (if ((660 > n))
267+ then ("item!ART-FEED25" != blacklistCode)
268+ else false)
236269 then "item!ART-FEED25"
237- else if ((680 > n))
270+ else if (if ((680 > n))
271+ then ("item!ART-FEED50" != blacklistCode)
272+ else false)
238273 then "item!ART-FEED50"
239- else if ((760 > n))
274+ else if (if ((760 > n))
275+ then ("item!ART-FEED100" != blacklistCode)
276+ else false)
240277 then "item!ART-FEED100"
241- else if ((780 > n))
278+ else if (if ((780 > n))
279+ then ("perch_G" != blacklistCode)
280+ else false)
242281 then "perch_G"
243- else if ((800 > n))
282+ else if (if ((800 > n))
283+ then ("perch_Y" != blacklistCode)
284+ else false)
244285 then "perch_Y"
245- else if ((820 > n))
286+ else if (if ((820 > n))
287+ then ("perch_R" != blacklistCode)
288+ else false)
246289 then "perch_R"
247- else if ((840 > n))
290+ else if (if ((840 > n))
291+ then ("perch_B" != blacklistCode)
292+ else false)
248293 then "perch_B"
249- else if ((880 > n))
294+ else if (if ((880 > n))
295+ then ("item!ART-MUTARIUM-D" != blacklistCode)
296+ else false)
250297 then "item!ART-MUTARIUM-D"
251- else if ((940 > n))
298+ else if (if ((940 > n))
299+ then ("incubator" != blacklistCode)
300+ else false)
252301 then "incubator"
253302 else "duck_incubator"
254303 $Tuple2(n, result)
255304 }
256305 }
257306
258307
259-func finishRebirthInternal (initTx,address,additionalPayment,double) = {
308+func getRandomReturn (tx,finishHeight) = {
309+ let n = getRandomNumber(2, tx, finishHeight, 1)
310+ if ((n == 0))
311+ then true
312+ else false
313+ }
314+
315+
316+func finishRebirthInternal (initTx,address,additionalPayment,double,blacklistCode,rescue) = {
260317 let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
261318 let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
262319 let validPayment = checkAdditionalPayment(additionalPayment)
263320 if ((validPayment == validPayment))
264321 then {
265322 let recordAction = invoke(getCouponsAddress(), "recordAction", ["REBIRTHTURTLE"], nil)
266323 if ((recordAction == recordAction))
267324 then if ((status != "open"))
268325 then throw("rebirth is finished or not open")
269326 else if ((finishBlock > height))
270327 then throw("you cannot finish rebirth, yet")
271328 else {
272- let output = getRandomWin(fromBase58String(initTx), finishBlock)
329+ let output = getRandomWin(fromBase58String(initTx), finishBlock, blacklistCode)
273330 let win = output._2
274331 let random = output._1
275332 let txId = initTx
276333 let result = if ((indexOf(win, "perch") != unit))
277334 then {
278335 let color = takeRight(win, 1)
279336 let call = if (!(double))
280337 then {
281338 let first = invoke(getDuckStakingAddress(), "addFreePerch", [address, color, 1], nil)
282339 if ((first == first))
283340 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
284341 else throw("Strict value is not equal to itself.")
285342 }
286343 else {
287344 let first = invoke(getDuckStakingAddress(), "addFreePerch", [address, color, 2], nil)
288345 if ((first == first))
289346 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
290347 else throw("Strict value is not equal to itself.")
291348 }
292349 if ((call == call))
293350 then call
294351 else throw("Strict value is not equal to itself.")
295352 }
296353 else if ((indexOf(win, "beach") != unit))
297354 then {
298355 let color = takeRight(win, 1)
299356 let call = if (!(double))
300357 then {
301358 let first = invoke(getTurtleStakingAddress(), "addFreeBeach", [address, color], nil)
302359 if ((first == first))
303360 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
304361 else throw("Strict value is not equal to itself.")
305362 }
306363 else {
307364 let first = invoke(getTurtleStakingAddress(), "addFreeBeach", [address, color], nil)
308365 if ((first == first))
309366 then {
310367 let second = invoke(getTurtleStakingAddress(), "addFreeBeach", [address, color], nil)
311368 if ((second == second))
312369 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
313370 else throw("Strict value is not equal to itself.")
314371 }
315372 else throw("Strict value is not equal to itself.")
316373 }
317374 if ((call == call))
318375 then call
319376 else throw("Strict value is not equal to itself.")
320377 }
321378 else if ((win == "jackpot"))
322379 then {
323380 let call = invoke(getTurtleIncubatorAddress(), "issueJackpot", [address, txId, valueOrElse(getString("JACKPOT_NAME"), "WWWWXMAS")], nil)
324381 if ((call == call))
325382 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
326383 else throw("Strict value is not equal to itself.")
327384 }
328385 else if ((win == "incubator"))
329386 then {
330387 let call = if (!(double))
331388 then {
332389 let first = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
333390 if ((first == first))
334391 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
335392 else throw("Strict value is not equal to itself.")
336393 }
337394 else {
338395 let first = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
339396 if ((first == first))
340397 then {
341398 let second = invoke(getDuckIncubatorAddress(), "issueFreeDuckDefinedGenes", [address, txId, "ZZZZZZZZ"], nil)
342399 if ((second == second))
343400 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), "duck_incubator")]
344401 else throw("Strict value is not equal to itself.")
345402 }
346403 else throw("Strict value is not equal to itself.")
347404 }
348405 if ((call == call))
349406 then call
350407 else throw("Strict value is not equal to itself.")
351408 }
352409 else if ((win == "duck_incubator"))
353410 then {
354411 let call = if (!(double))
355412 then {
356413 let first = invoke(getDuckIncubatorAddress(), "issueFreeDuckDefinedGenes", [address, txId, "ZZZZZZZZ"], nil)
357414 if ((first == first))
358415 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
359416 else throw("Strict value is not equal to itself.")
360417 }
361418 else {
362419 let first = invoke(getDuckIncubatorAddress(), "issueFreeDuckDefinedGenes", [address, txId, "ZZZZZZZZ"], nil)
363420 if ((first == first))
364421 then {
365422 let second = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
366423 if ((second == second))
367424 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), "incubator")]
368425 else throw("Strict value is not equal to itself.")
369426 }
370427 else throw("Strict value is not equal to itself.")
371428 }
372429 if ((call == call))
373430 then call
374431 else throw("Strict value is not equal to itself.")
375432 }
376433 else if ((indexOf(win, "item") != unit))
377434 then {
378435 let itemName = split(win, "!")[1]
379436 let call = if (!(double))
380437 then {
381438 let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
382439 if ((first == first))
383440 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
384441 else throw("Strict value is not equal to itself.")
385442 }
386443 else {
387444 let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
388445 if ((first == first))
389446 then {
390447 let second = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 1], nil)
391448 if ((second == second))
392449 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
393450 else throw("Strict value is not equal to itself.")
394451 }
395452 else throw("Strict value is not equal to itself.")
396453 }
397454 if ((call == call))
398455 then call
399456 else throw("Strict value is not equal to itself.")
400457 }
401458 else throw("RFB: Some error occured, please contact the admins!")
459+ let returnToSender = if (rescue)
460+ then getRandomReturn(fromBase58String(initTx), finishBlock)
461+ else false
462+ let returnPayload = if (returnToSender)
463+ then {
464+ let assetId = fromBase58String(getStringValue((((("address_" + address) + "_initTx_") + initTx) + "_assetId")))
465+ let issuer = checkReal(assetId)
466+ let gen = asString(invoke(getTurtleBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
467+ if ((gen == gen))
468+ then {
469+ let call = invoke(issuer, "increaseRarity", [toBase58String(assetId), gen], nil)
470+ if ((call == call))
471+ then [ScriptTransfer(addressFromStringValue(address), 1, assetId)]
472+ else throw("Strict value is not equal to itself.")
473+ }
474+ else throw("Strict value is not equal to itself.")
475+ }
476+ else nil
402477 ((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_random"), random)]) ++ validPayment)
403478 }
404479 else throw("Strict value is not equal to itself.")
405480 }
406481 else throw("Strict value is not equal to itself.")
407482 }
408483
409484
410485 @Callable(i)
411486 func configureOracle (oracle) = if ((i.caller != this))
412487 then throw("RCU: admin only")
413488 else [StringEntry("static_oracleAddress", oracle)]
414489
415490
416491
417492 @Callable(i)
418493 func initRebirth (refererAddress) = {
419494 let pmtTurtle = i.payments[0]
420495 let pmtWaves = i.payments[1]
421496 let pmtSpice = i.payments[2]
422497 let assetId = value(pmtTurtle.assetId)
423498 let initTx = toBase58String(i.transactionId)
424499 let address = toString(i.caller)
425500 if ((pmtTurtle.amount != 1))
426501 then throw("NFT is not attached")
427502 else if (if ((pmtWaves.amount != wavesAmount))
428503 then true
429504 else (pmtWaves.assetId != unit))
430505 then throw("Wavespayment is not attached or wrong!")
431506 else if (if ((pmtSpice.amount != spiceAmount))
432507 then true
433508 else (pmtSpice.assetId != getSpiceAssetId()))
434509 then throw("SpicePayment is not attached or wrong!")
435510 else {
436511 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [eggAmount], nil))
437512 if ((amountPaidByCoupons == amountPaidByCoupons))
438513 then {
439514 let leftToPay = (eggAmount - amountPaidByCoupons)
440515 let topup = invoke(getTurtleStakingAddress(), "topUpReward", nil, [AttachedPayment(getSpiceAssetId(), pmtSpice.amount)])
441516 if ((topup == topup))
442517 then {
443518 let payment = if ((leftToPay != 0))
444519 then {
445520 let pmtEgg = i.payments[3]
446521 let feePayment = value(pmtEgg)
447522 if ((feePayment.assetId != getEggAssetId()))
448523 then throw("You need to attach EGG tokens as fee")
449524 else if ((feePayment.amount != leftToPay))
450525 then throw(("You need to attach the following amount of EGG tokens as fee: 0." + toString(leftToPay)))
451526 else {
452527 let refererRewardForPerch = fraction(leftToPay, 5, 100)
453528 let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
454529 if ((refCall == refCall))
455530 then {
456531 let toBurn = if (refCall)
457532 then (leftToPay - refererRewardForPerch)
458533 else leftToPay
459534 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
460535 if ((burnCall == burnCall))
461536 then leftToPay
462537 else throw("Strict value is not equal to itself.")
463538 }
464539 else throw("Strict value is not equal to itself.")
465540 }
466541 }
467542 else 0
468543 if ((payment == payment))
469544 then {
470545 let realTurtle = checkRealTurtle(assetId)
471546 if ((realTurtle == realTurtle))
472547 then [IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"), (height + delayForHatching)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "open"), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetId"), toBase58String(assetId)), ScriptTransfer(getFeeAggregator(), pmtWaves.amount, unit)]
473548 else throw("Strict value is not equal to itself.")
474549 }
475550 else throw("Strict value is not equal to itself.")
476551 }
477552 else throw("Strict value is not equal to itself.")
478553 }
479554 else throw("Strict value is not equal to itself.")
480555 }
481556 }
482557
483558
484559
485560 @Callable(i)
486-func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false)
561+func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
487562
488563
489564
490565 @Callable(i)
491566 func finishRebirthDouble (initTx) = if (!(if ((size(i.payments) == 2))
492567 then (i.payments[0].amount == 1)
493568 else false))
494569 then throw("Invalid payment")
495570 else {
496571 let assetId = value(i.payments[0].assetId)
497572 let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
498573 if ((boosterType == boosterType))
499574 then if ((boosterType == "ART-GIFT_DOUBL"))
500- then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true))
575+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
501576 else throw("Error! Wrong item attached to double rewards!")
502577 else throw("Strict value is not equal to itself.")
503578 }
579+
580+
581+
582+@Callable(i)
583+func finishRebirthItem (initTx,itemCode) = if (if ((size(i.payments) == 2))
584+ then (i.payments[0].amount == 1)
585+ else false)
586+ then {
587+ let assetId = value(i.payments[0].assetId)
588+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
589+ if ((boosterType == boosterType))
590+ then if ((boosterType == "ART-HWERASE"))
591+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, itemCode, false))
592+ else if ((boosterType == "ART-HWRESCUE"))
593+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, "", true))
594+ else if ((boosterType == "ART-GIFT_DOUBL"))
595+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
596+ else throw("Error! Wrong item attached ")
597+ else throw("Strict value is not equal to itself.")
598+ }
599+ else if ((size(i.payments) == 1))
600+ then finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
601+ else throw("Invalid payments")
504602
505603
506604 @Verifier(tx)
507605 func verify () = if (isTestEnv())
508606 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
509607 else {
510608 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
511609 let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
512610 let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
513611 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
514612 then 1
515613 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
516614 then 1
517615 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
518616 then 1
519617 else 0
520618 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
521619 then 1
522620 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
523621 then 1
524622 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
525623 then 1
526624 else 0
527625 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
528626 then 1
529627 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
530628 then 1
531629 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
532630 then 1
533631 else 0
534632 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
535633 match tx {
536634 case _ =>
537635 (signaturesCount >= 2)
538636 }
539637 }
540638

github/deemru/w8io/026f985 
82.35 ms