tx · 9d2rSLYLDGdMMVmSniKuxYJJNP7L3wHvfzBsKHwcZkuz

3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm:  -0.10700000 Waves

2023.10.10 18:09 [2792688] smart account 3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm > SELF 0.00000000 Waves

{ "type": 13, "id": "9d2rSLYLDGdMMVmSniKuxYJJNP7L3wHvfzBsKHwcZkuz", "fee": 10700000, "feeAssetId": null, "timestamp": 1696950560346, "version": 2, "chainId": 84, "sender": "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm", "senderPublicKey": "EVooykMNV691Venwp1dHUTBd7KWequzUcda57Wd3LQEX", "proofs": [ "jStYqKyT7wKAc2pVdNB6RJtqpUb9zsdcotR9mjq9QSwuQtXLvg4iQdJP7sbiemAaZSTsZntUzpgaeS22MTq7ZuH" ], "script": "base64:BgLkAQgCEgMKAQgSBAoCCAESAwoBBBIAEgMKAQgSABIDCgEIEgQKAgEIEgQKAgEIEgQKAgICEgUKAwEBARIAEgQKAggIEgASABIECgICAhIAEgMKAQgSBAoCCAgSAwoBGBIECgIICBIECgIICBIDCgEIEgMKARgSAwoBCBIFCgMICAgSBAoCCAgSBwoFAQEBAQESAwoBARIFCgMBAQgSAwoBCBIDCgEIEgASBAoCCAESBAoCCAESAwoBCBIECgIICBIDCgEIEgASAwoBCBIDCgEIEgYKBAgBCAESBAoCAgISBAoCAgISAJ0CAAlEQVlNSUxMSVMAgLiZKQATREVMSVZFUllfUFVOSVNITUVOVADg1AMBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIABlNDQUxFOACAwtcvAAx4cExldmVsU2NhbGUAgBkAD3hwTGV2ZWxSZWNpcFBvdwCgHwASbnVtUG9pbnRzT25MZXZlbFVwAAMADnJvYmJlcnlDb3N0TWluAIDC1y8AFHJvYmJlcnlDb29sZG93bkNvZWZmAJADAAxyZXF1aXJlbWVudHMJAMwIAgIIU3RyZW5ndGgJAMwIAgIIQWNjdXJhY3kJAMwIAgIJSW50ZWxsZWN0CQDMCAICCUVuZHVyYW5jZQkAzAgCAglEZXh0ZXJpdHkJAMwIAgIFTGV2ZWwJAMwIAgIGSGVhbHRoBQNuaWwADGNoYXJTdHJlbmd0aAAAAAxjaGFyQWNjdXJhY3kAAQANY2hhckludGVsbGVjdAACAA1jaGFyRW5kdXJhbmNlAAMADWNoYXJEZXh0ZXJpdHkABAALc2VnQmFja3BhY2sAAAALTlVNU0VHTUVOVFMABgAKTlVNTUFJTkFVWAACAAhNQVhTTE9UUwACAA1NQVhQUk9ESU5TTE9UAB4AEGxhbmRSb2JDb29sZG93bnMJAMwIAgAACQDMCAIAwM8kCQDMCAIAoPc2CQDMCAIAgNzMFAkAzAgCAICupgoFA25pbAAOTUlOX1JFU19UT19ST0IAgNrECQAMcm9iSWR4TG9ja2VkAAEAC2R1Y2tJZHhGcmVlAAAAEGR1Y2tJZHhQcmVwYXJpbmcAAQENa2V5RHVja0hlYWx0aAELZHVja0Fzc2V0SWQJAKwCAgILZHVja0hlYWx0aF8FC2R1Y2tBc3NldElkAQxrZXlEdWNrQ2hhcnMBC2R1Y2tBc3NldElkCQCsAgICCmR1Y2tDaGFyc18FC2R1Y2tBc3NldElkAQlrZXlEdWNrWFABC2R1Y2tBc3NldElkCQCsAgICB2R1Y2tYUF8FC2R1Y2tBc3NldElkAQxrZXlEdWNrTGV2ZWwBC2R1Y2tBc3NldElkCQCsAgICCmR1Y2tMZXZlbF8FC2R1Y2tBc3NldElkARFrZXlEdWNrRnJlZVBvaW50cwELZHVja0Fzc2V0SWQJAKwCAgIPZHVja0ZyZWVQb2ludHNfBQtkdWNrQXNzZXRJZAEQa2V5RHVja0VxdWlwbWVudAELZHVja0Fzc2V0SWQJAKwCAgIOZHVja0VxdWlwbWVudF8FC2R1Y2tBc3NldElkAQlrZXlVc2VyWFABBGFkZHIJAKwCAgIHdXNlclhQXwUEYWRkcgEMa2V5VXNlckxldmVsAQRhZGRyCQCsAgICCnVzZXJMZXZlbF8FBGFkZHIBEWtleVVzZXJGcmVlUG9pbnRzAQRhZGRyCQCsAgICD3VzZXJGcmVlUG9pbnRzXwUEYWRkcgEOa2V5U2F2ZWRIZWFsdGgBC2R1Y2tBc3NldElkCQCsAgICDHNhdmVkSGVhbHRoXwULZHVja0Fzc2V0SWQBEGtleVNhdmVkTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDnNhdmVkTG9jYXRpb25fBQtkdWNrQXNzZXRJZAEMa2V5RHVja0J1ZmZzAQtkdWNrQXNzZXRJZAkArAICAgpkdWNrQnVmZnNfBQtkdWNrQXNzZXRJZAEYa2V5TGFzdFJvYmJlcnlUaW1lQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAhBsYXN0Um9iYmVyeVRpbWVfBQtkdWNrQXNzZXRJZAEYa2V5TGFzdFJvYmJlcnlDb3N0QnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAhBsYXN0Um9iYmVyeUNvc3RfBQtkdWNrQXNzZXRJZAETa2V5TGFuZFJvYmJlcnlTdGF0ZQELbGFuZEFzc2V0SWQJAKwCAgIRbGFuZFJvYmJlcnlTdGF0ZV8FC2xhbmRBc3NldElkARJrZXlMYW5kQ29vbGRvd25FVEEBC2xhbmRBc3NldElkCQCsAgICEGxhbmRDb29sZG93bkVUQV8FC2xhbmRBc3NldElkARNrZXlEdWNrUm9iYmVyeVN0YXRlAQtkdWNrQXNzZXRJZAkArAICAhFkdWNrUm9iYmVyeVN0YXRlXwULZHVja0Fzc2V0SWQBE2tleUxvY2tlZExhbmRCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEWxvY2tlZExhbmRCeUR1Y2tfBQtkdWNrQXNzZXRJZAEWa2V5RGVsaXZlcnlEZWxheUJ5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIUZGVsaXZlcnlEZWxheUJ5RHVja18FC2R1Y2tBc3NldElkAAd4cENsYWltAJBOAA94cFN1Y2Nlc3NGbGlnaHQAkE4ADHhwRmFpbEZsaWdodADQDwAIeHBDYWxsRVMAoI0GAAx4cEN1c3RvbU5hbWUAwIQ9AAp4cE5ld1NMYW5kAMCWsQIADnhwVXBncmFkZUluZnJhAJBOAAd4cE1lcmdlAMCEPQAJeHBPbmJvYXJkAMCEPQAGeHBIZWFsAJBOAQlsZXZlbEJ5WFABAnhwCQBrAwUMeHBMZXZlbFNjYWxlCQBsBgUCeHAABAUPeHBMZXZlbFJlY2lwUG93AAQABAUERE9XTgUGU0NBTEU4AQltYXhIZWFsdGgBBWxldmVsCQBkAgBkBQVsZXZlbAEHbGV2ZWxVcAIJY3VyckxldmVsBW5ld1hQBAhuZXdMZXZlbAkBCWxldmVsQnlYUAEFBW5ld1hQCQDMCAIFCG5ld0xldmVsCQDMCAIJAGgCBRJudW1Qb2ludHNPbkxldmVsVXAJAGUCBQhuZXdMZXZlbAUJY3VyckxldmVsBQNuaWwBDGdldER1Y2tTdGF0cwQPc3Rha2luZ0NvbnRyYWN0C2R1Y2tBc3NldElkCmJ1ZmZFZmZlY3QKZm9yY2VCdWZmcwQFY2hhcnMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrQ2hhcnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wAgFfBANsdmwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAQGaGVhbHRoCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAkBCW1heEhlYWx0aAEFA2x2bAQKc3RhdGVCdWZmcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleUR1Y2tCdWZmcwEFC2R1Y2tBc3NldElkAgkwXzBfMF8wXzACAV8JAM4IAgkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDGNoYXJTdHJlbmd0aAkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDGNoYXJBY2N1cmFjeQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDWNoYXJJbnRlbGxlY3QJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFyRW5kdXJhbmNlCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckRleHRlcml0eQkAzAgCBQNsdmwJAMwIAgUGaGVhbHRoBQNuaWwDBQpmb3JjZUJ1ZmZzCQDMCAIFCmJ1ZmZFZmZlY3QJAMwIAgUKYnVmZkVmZmVjdAkAzAgCBQpidWZmRWZmZWN0CQDMCAIFCmJ1ZmZFZmZlY3QJAMwIAgUKYnVmZkVmZmVjdAUDbmlsCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpzdGF0ZUJ1ZmZzBQxjaGFyU3RyZW5ndGgJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnN0YXRlQnVmZnMFDGNoYXJBY2N1cmFjeQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3RhdGVCdWZmcwUNY2hhckludGVsbGVjdAkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3RhdGVCdWZmcwUNY2hhckVuZHVyYW5jZQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3RhdGVCdWZmcwUNY2hhckRleHRlcml0eQUDbmlsAQ5nZXRSb2JiZXJ5RGF0YQIPc3Rha2luZ0NvbnRyYWN0C2R1Y2tBc3NldElkBAtsYXN0Um9iQ29zdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARhrZXlMYXN0Um9iYmVyeUNvc3RCeUR1Y2sBBQtkdWNrQXNzZXRJZAAABAtsYXN0Um9iVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARhrZXlMYXN0Um9iYmVyeVRpbWVCeUR1Y2sBBQtkdWNrQXNzZXRJZAAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAdyb2JDb3N0CQCWAwEJAMwIAgUOcm9iYmVyeUNvc3RNaW4JAMwIAgkAZQIFC2xhc3RSb2JDb3N0CQBoAgUUcm9iYmVyeUNvb2xkb3duQ29lZmYJAGUCBQNub3cFC2xhc3RSb2JUaW1lBQNuaWwECWR1Y2tTdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARNrZXlEdWNrUm9iYmVyeVN0YXRlAQULZHVja0Fzc2V0SWQAAAQKbG9ja2VkTGFuZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARNrZXlMb2NrZWRMYW5kQnlEdWNrAQULZHVja0Fzc2V0SWQCAAQHbGFuZEVUQQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARJrZXlMYW5kQ29vbGRvd25FVEEBBQpsb2NrZWRMYW5kAAAJAJcKBQUHcm9iQ29zdAULbGFzdFJvYlRpbWUFCWR1Y2tTdGF0ZQUKbG9ja2VkTGFuZAUHbGFuZEVUQQAKTEFORFBSRUZJWAIETEFORAAKRFVDS1BSRUZJWAIERFVDSwAKQVJUUFJFU0FMRQIHUFJFU0FMRQAGTlVNUkVTAAYAGE1BWF9MQU5EU19TVEFLRURfQllfVVNFUgAZAA9EQUlMWVJFU0JZUElFQ0UAgPjSAQAMV0hNVUxUSVBMSUVSAIDIr6AlAA9ERUZBVUxUTE9DQVRJT04CD0FmcmljYV9GX0FmcmljYQAQUkVTT1VSQ0VQUklDRU1JTgDVtQIACkVTU0VMTENPRUYACgAVTUlOX1VTRFRfRkVFX0RFTElWRVJZANCGAwASVEVOX01JTlVURVNfTUlMTElTAMDPJAAJcHJvZFR5cGVzCQDMCAICEEZpcnN0IEFpZCBLaXQgTDEJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMgkAzAgCAhBGaXJzdCBBaWQgS2l0IEwzCQDMCAICC0JhY2twYWNrIEwxCQDMCAICC0JhY2twYWNrIEwyCQDMCAICC0JhY2twYWNrIEwzCQDMCAICDkZvb2QgUmF0aW9uIEwxCQDMCAICDkZvb2QgUmF0aW9uIEwyCQDMCAICDkZvb2QgUmF0aW9uIEwzCQDMCAICC0pldCBQYWNrIEwxCQDMCAICC0pldCBQYWNrIEwyCQDMCAICC0pldCBQYWNrIEwzCQDMCAICCVNoaWVsZCBMMQkAzAgCAglTaGllbGQgTDIJAMwIAgIJU2hpZWxkIEwzCQDMCAICB01pbmUgTDEJAMwIAgIHTWluZSBMMgkAzAgCAgdNaW5lIEwzCQDMCAICB1RyYXAgTDEJAMwIAgIHVHJhcCBMMgkAzAgCAgdUcmFwIEwzBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAJQ09FRkYyTUFUAICt4gQAEGZvcnRBbGxvd2VkUHJvZHMJAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwkAzAgCABQFA25pbAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAiU4XzhfOF8xN18xN180Ml8xMl8wXzMwXzAsMCwwLDAsMCwwLDBfCQDMCAICJThfOF84XzE3XzE3XzQyXzI0XzBfNjBfMCwwLDUsMiwwLDAsMF8JAMwIAgInOF84XzhfMTdfMTdfNDJfMzZfMF8xMjBfMCwwLDEwLDQsMCwwLDBfCQDMCAICKThfMTlfMTlfOF8yN18xOV8yNl8xXzIwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV81Ml8xXzQwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV83OF8xXzgwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICJThfOF84XzhfOF82MF8xM18yXzJfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzI2XzJfNF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAiU4XzhfOF84XzhfNjBfMzlfMl84XzAsMCwwLDAsMCwwLDBfMDExCQDMCAICKTMwXzMwXzNfMTdfMTdfM18zMF8zXzMwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM182MF8zXzUwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM185MF8zXzcwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzExXzRfMTBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMjJfNF8yMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8zM180XzMwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKjRfMTNfMjJfNF8zNV8yMl8yM18wXzUwLDEsMF8wLDAsMCwwLDAsMCwwXwkAzAgCAio0XzEzXzIyXzRfMzVfMjJfNDZfMF81MCwxLDFfMCwyLDUsMCwwLDAsMF8JAMwIAgIrNF8xM18yMl80XzM1XzIyXzY5XzBfNTAsMiwxXzAsNSwxMCwwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfMjBfMV8zMCwxLDFfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzQwXzFfMzAsMSwyXzIsMSwzLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV82MF8xXzMwLDEsM181LDIsOCwwLDAsMCwwXwUDbmlsAAlySWR4Q29lZmYABgAKcklkeEVmZmVjdAAIABBySWR4UmVxdWlyZW1lbnRzAAkACXJJZHhTbG90cwAKAA5QUk9EVUNUUEtHU0laRQAKAAt3aElkeExldmVscwAAAAh3aElkeFJlcwABAAh3aElkeE1hdAACAAl3aElkeFByb2QAAwAJd2hJZHhMT0ZUAAQACXZvbExvY2tlZAAAAAt2b2xPY2N1cGllZAABAAd2b2xGcmVlAAIACHZvbFRvdGFsAAMACmJwSWR4TGV2ZWwAAAAIYnBJZHhSZXMAAQAIYnBJZHhNYXQAAgAJYnBJZHhQcm9kAAMAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEACGxvY0lkeElkAAIBFWtleUxhbmRBc3NldElkVG9Pd25lcgEHYXNzZXRJZAkArAICAgNub18FB2Fzc2V0SWQBGmtleUxhbmRBc3NldElkVG9DdXN0b21OYW1lAQdhc3NldElkCQCsAgICBWxjbmFfBQdhc3NldElkARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQdhc3NldElkCQCsAgICA3N0XwUHYXNzZXRJZAEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBHR5cGUHYXNzZXRJZAkAuQkCCQDMCAICA2xhcwkAzAgCBQR0eXBlCQDMCAIFB2Fzc2V0SWQFA25pbAIBXwEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMHbmZ0VHlwZQdhc3NldElkCW93bmVyQWRkcgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBnN0dGFvXwUHbmZ0VHlwZQIBXwUHYXNzZXRJZAIBXwUJb3duZXJBZGRyARJrZXlXYXJlaG91c2VCeUxhbmQBC2xhbmRBc3NldElkCQCsAgICA3doXwULbGFuZEFzc2V0SWQBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBB2Fzc2V0SWQJAKwCAgILaW5mcmFMZXZlbF8FB2Fzc2V0SWQBF2tleUZvcnRpZmljYXRpb25zQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAg9mb3J0aWZpY2F0aW9uc18FC2xhbmRBc3NldElkARprZXlEdWNrQXNzZXRJZFRvQ3VzdG9tTmFtZQEHYXNzZXRJZAkArAICAhhkdWNrQ3VzdG9tTmFtZUJ5QXNzZXRJZF8FB2Fzc2V0SWQBFmtleUFkZHJlc3NUb0N1c3RvbU5hbWUBBGFkZHIJAKwCAgIYYWNjb3VudEN1c3RvbU5hbWVCeUFkZHJfBQRhZGRyAQ9rZXlBZGRyZXNzUmVmQnkBBGFkZHIJAKwCAgIJYWNjUmVmQnlfBQRhZGRyARxrZXlPbmJvYXJkQXJ0QWN0aXZhdGVkT25EdWNrAQtkdWNrQXNzZXRJZAkArAICAhpvbmJvYXJkQXJ0QWN0aXZhdGVkT25EdWNrXwULZHVja0Fzc2V0SWQBHGtleU9uYm9hcmRBcnREdWNrQWN0aXZhdGVkQnkBBGFkZHIJAKwCAgIab25ib2FyZEFydEFjdGl2YXRlZER1Y2tCeV8FBGFkZHIBE2tleUFkZHJlc3NSZWZlcnJhbHMBBGFkZHIJAKwCAgINYWNjUmVmZXJyYWxzXwUEYWRkcgEQa2V5RHVja0lkVG9Pd25lcgEHYXNzZXRJZAkArAICAgpkdWNrT3duZXJfBQdhc3NldElkARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyARFrZXlCYWNrcGFja0J5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIJYmFja1BhY2tfBQtkdWNrQXNzZXRJZAEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAEVa2V5VXNlckd3bFJlbGVhc2VUaW1lAQh1c2VyQWRkcgkArAICAholcyVzX191c2VyR3dsUmVsZWFzZVRpbWVfXwUIdXNlckFkZHIBDmtleUVzV2FyZWhvdXNlAAIaZW1lcmdlbmN5V2FyZWhvdXNlUHJvZHVjdHMAD2RlbGl2ZXJ5RnVuZEtleQIMZGVsaXZlcnlGdW5kABFkZWxpdmVyeUxvY2tlZEtleQIOZGVsaXZlcnlMb2NrZWQADWxhc3RUb3VySWRLZXkCDiVzX19sYXN0VG91cklkARVrZXlUb3VyU3RhdGljRGF0YUJ5SWQBA3RJZAkArAICAhYlcyVkX190b3VyU3RhdGljRGF0YV9fCQCkAwEFA3RJZAEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEDdElkCQCsAgICFyVzJWRfX3RvdXJEeW5hbWljRGF0YV9fCQCkAwEFA3RJZAEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICHyVzJWQlc19fYmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18ACWlkeFN0YXRpYwAAAAppZHhEeW5hbWljAAEACnRTdGF0aWNFbmQABgAOdER5bmFtaWNTdGF0dXMAAQELZ2V0VG91ckRhdGECDHRvdXJDb250cmFjdAN0SWQEBnN0YXRpYwkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMdG91ckNvbnRyYWN0CQEVa2V5VG91clN0YXRpY0RhdGFCeUlkAQUDdElkCQCsAgIJAKwCAgIZRXJyb3IgcmVhZGluZyB0b3VybmFtZW50IAkApAMBBQN0SWQCBSBkYXRhAgJfXwQHZHluYW1pYwkAvAkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMdG91ckNvbnRyYWN0CQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFA3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUDdElkAgUgZGF0YQICX18JAMwIAgUGc3RhdGljCQDMCAIFB2R5bmFtaWMFA25pbAEOaXNJblRvdXJuYW1lbnQCDHRvdXJDb250cmFjdAhsb2NhdGlvbgQGbGFzdElkCQELdmFsdWVPckVsc2UCCQCaCAIFDHRvdXJDb250cmFjdAUNbGFzdFRvdXJJZEtleQAABANsb2MJALUJAgUIbG9jYXRpb24CAV8EA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEBXREYXRhCQELZ2V0VG91ckRhdGECBQx0b3VyQ29udHJhY3QFBmxhc3RJZAQGc3RhdGljCQCRAwIFBXREYXRhBQlpZHhTdGF0aWMEB2R5bmFtaWMJAJEDAgUFdERhdGEFCmlkeER5bmFtaWMDAwMJAAACCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBVAkAAAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsb2MFD2xvY0lkeENvbnRpbmVudAUGbGFzdElkBwkAAAIJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMCCklOUFJPR1JFU1MHCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAUDbm93BwEMaXNJbkRlbGl2ZXJ5AQhsb2NhdGlvbgQDbG9jCQC1CQIFCGxvY2F0aW9uAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlzdGFydFRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsb2MFD2xvY0lkeENvbnRpbmVudAQIZGlzdGFuY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsb2MFCGxvY0lkeElkAwMJAAACCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBRAkAZgIJAGQCBQlzdGFydFRpbWUFElRFTl9NSU5VVEVTX01JTExJUwUDbm93BwkAZwIAAwUIZGlzdGFuY2UHAQ9pc1VzdWFsTG9jYXRpb24BCGxvY2F0aW9uBAdsb2NUeXBlCQCRAwIJALUJAgUIbG9jYXRpb24CAV8FCmxvY0lkeFR5cGUDCQECIT0CBQdsb2NUeXBlAgFUCQECIT0CBQdsb2NUeXBlAgFEBwEJb25NaXNzaW9uAgx0b3VyQ29udHJhY3QIbG9jYXRpb24EBmxhc3RJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQx0b3VyQ29udHJhY3QFDWxhc3RUb3VySWRLZXkAAAQDbG9jCQC1CQIFCGxvY2F0aW9uAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUMdG91ckNvbnRyYWN0BQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljBAdsb2NUeXBlCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQMJAAACBQdsb2NUeXBlAgFEBgMDAwkAAAIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFUCQAAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2xvYwUPbG9jSWR4Q29udGluZW50BQZsYXN0SWQHCQAAAgkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwIKSU5QUk9HUkVTUwcJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQNub3cHARJnZXRSZWNpcGVNYXRlcmlhbHMBBnJlY2lwZQkAaAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZyZWNpcGUFCXJJZHhDb2VmZgUJQ09FRkYyTUFUAQxjaGVhdEF0dGVtcHQDBm9sZExvYwZuZXdMb2MJY2hlYXRDYXNlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICFkNoZWF0IGF0dGVtcHQ6IG9sZExvYz0FBm9sZExvYwIJLCBuZXdMb2M9BQZuZXdMb2MCBywgY2FzZT0JAKQDAQUJY2hlYXRDYXNlABZLU19TRVBBUkFURV9QVUJMSUNfS0VZBwAYS1NfQUxMT1dfQklHX0lORlJBX01FUkdFBwARS1NfQUxMT1dfREVMSVZFUlkGAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4AEUluZnJhVXBncmFkZUNvc3RTBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAIDIr6AlAwkAAAIBAVQFByRtYXRjaDAAgMLXLwkAAgECDVVua25vd24gY2hhaW4ADmFyYml0cmFnZURlbGF5BAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAIC4mSkDCQAAAgEBVAUHJG1hdGNoMADg1AMJAAIBAg1Vbmtub3duIGNoYWluAANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8ABVNTSVpFABkABU1TSVpFAGQABUxTSVpFAOEBAAZYTFNJWkUAkAMAB1hYTFNJWkUA8QQABUlURVI2CQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABFJZHhDZmdTdGFraW5nRGFwcAABABFJZHhDZmdFY29ub215RGFwcAACABRJZHhDZmdHb3Zlcm5hbmNlRGFwcAADAA1JZHhDZmdXbGdEYXBwAAQAFElkeENmZ1RvdXJuYW1lbnREYXBwAAcAD0lkeENmZ0FjcmVzRGFwcAAIAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIHcmVzdENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB3Jlc3RDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwAA9lY29ub215Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdFY29ub215RGFwcAALZ292Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdHb3Zlcm5hbmNlRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ1JZHhDZmdXbGdEYXBwABJ0b3VybmFtZW50Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdUb3VybmFtZW50RGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAAKcmVjTGFuZE51bQAAAAtyZWNMYW5kU2l6ZQABAAtyZWNUZXJyYWlucwACAAxyZWNDb250aW5lbnQAAwANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0AA9hY3Jlc0Fzc2V0SWRLZXkCDGFjcmVzQXNzZXRJZAAMYWNyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgUNYWNyZXNDb250cmFjdAUPYWNyZXNBc3NldElkS2V5AhdBQ1JFUyBpcyBub3QgaXNzdWVkIHlldAALcmFuZG9tRGVsYXkAAgEJa2V5Q29tbWl0AQdhZGRyZXNzCQCsAgICE2ZpbmlzaEJsb2NrRm9yQWRkcl8FB2FkZHJlc3MBEWtleVJlc1Byb3BvcnRpb25zAAITcmVzVHlwZXNQcm9wb3J0aW9ucwEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAEJY29udGluZW50CQCsAgICFHJlc1R5cGVzQnlDb250aW5lbnRfBQljb250aW5lbnQBFWtleVN0YWtlZExhbmRzQnlPd25lcgEJb3duZXJBZGRyCQCsAgICE3N0YWtlZExhbmRzQnlPd25lcl8FCW93bmVyQWRkcgEWa2V5U3Rha2VkUGllY2VzQnlPd25lcgEJb3duZXJBZGRyCQCsAgICFHN0YWtlZFBpZWNlc0J5T3duZXJfBQlvd25lckFkZHIBCGFzU3RyaW5nAQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQlhc0FueUxpc3QBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIJTGlzdFtBbnldBAFsBQckbWF0Y2gwBQFsCQACAQIbZmFpbCB0byBjYXN0IGludG8gTGlzdFtBbnldAQlhc0Jvb2xlYW4BAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBcwUHJG1hdGNoMAUBcwkAAgECGWZhaWwgdG8gY2FzdCBpbnRvIEJvb2xlYW4BEGFzU3RyaW5nSW50VHVwbGUBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACDShTdHJpbmcsIEludCkEAnQyBQckbWF0Y2gwBQJ0MgkAAgECH2ZhaWwgdG8gY2FzdCBpbnRvIChTdHJpbmcsIEludCkBD251bVBpZWNlc0J5U2l6ZQEIbGFuZFNpemUEByRtYXRjaDAFCGxhbmRTaXplAwkAAAICAVMFByRtYXRjaDAFBVNTSVpFAwkAAAICAU0FByRtYXRjaDAFBU1TSVpFAwkAAAICAUwFByRtYXRjaDAFBUxTSVpFAwkAAAICAlhMBQckbWF0Y2gwBQZYTFNJWkUDCQAAAgIDWFhMBQckbWF0Y2gwBQdYWExTSVpFCQACAQIRVW5rbm93biBsYW5kIHNpemUBB2lzRGlnaXQBAXMJAQlpc0RlZmluZWQBCQC2CQEFAXMBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkARFrZXlMYXN0VHhJZEJ5VXNlcgEEYWRkcgkArAICAg9sYXN0VHhJZEJ5VXNlcl8FBGFkZHIBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVy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b3duZXJBZGRyARFrZXlMYW5kTnVtVG9Pd25lcgEHbGFuZE51bQkArAICAgNsb18FB2xhbmROdW0BGmtleUR1Y2tDdXN0b21OYW1lVG9Bc3NldElkAQRuYW1lCQCsAgICEWR1Y2tCeUN1c3RvbU5hbWVfBQRuYW1lARZrZXlDdXN0b21OYW1lVG9BZGRyZXNzAQRuYW1lCQCsAgICFGFjY291bnRCeUN1c3RvbU5hbWVfBQRuYW1lAQlrZXlPbGRpZXMAAgpvbGRpZXNMaXN0AAtjbGFpbU1vZGVXaAAAAA1jbGFpbU1vZGVEdWNrAAEAE2NsYWltTW9kZVdoVGhlbkR1Y2sAAgAIZmxIZWFsdGgAAAALZmxUaW1lc3RhbXAABQAHZmxCb251cwAGAAtmbFByb2RzVXNlZAAHAQduZnROYW1lAgdsYW5kTnVtCGxhbmRTaXplCQCsAgIJAKwCAgUKTEFORFBSRUZJWAUHbGFuZE51bQUIbGFuZFNpemUBCHRvVm9sdW1lAgZhbW91bnQHcGtnU2l6ZQQEcGtncwMJAGcCBQZhbW91bnQAAAkAaQIJAGUCCQBkAgUGYW1vdW50BQdwa2dTaXplAAEFB3BrZ1NpemUJAQEtAQkAaQIJAGUCCQBkAgkBAS0BBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkAaAIFBHBrZ3MFBU1VTFQ4ARNkaXN0cmlidXRlQnlXZWlnaHRzAgV0b3RhbAd3ZWlnaHRzBANzdW0JAGQCCQBkAgkAZAIJAGQCCQBkAgkAkQMCBQd3ZWlnaHRzAAAJAJEDAgUHd2VpZ2h0cwABCQCRAwIFB3dlaWdodHMAAgkAkQMCBQd3ZWlnaHRzAAMJAJEDAgUHd2VpZ2h0cwAECQCRAwIFB3dlaWdodHMABQMJAGcCAAAFA3N1bQkAAgECEFplcm8gd2VpZ2h0cyBzdW0EBW5vcm02CQBrAwUFdG90YWwFBU1VTFQ2BQNzdW0KAQpub3JtYWxpemVyAgNhY2MEZWxlbQkAzQgCBQNhY2MJAGsDBQRlbGVtBQVub3JtNgUFTVVMVDYKAAIkbAUHd2VpZ2h0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKbm9ybWFsaXplcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgESZ2V0TmVlZGVkTWF0ZXJpYWxzAQV0b3RhbAQFcHJvcHMJALUJAgkBBXZhbHVlAQkAoggBCQERa2V5UmVzUHJvcG9ydGlvbnMAAgFfAwkBAiE9AgkAkAMBBQVwcm9wcwUGTlVNUkVTCQACAQIWV3JvbmcgcHJvcG9ydGlvbnMgZGF0YQQBcgkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcHJvcHMAAAkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcHJvcHMAAQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcHJvcHMAAgkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcHJvcHMAAwkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcHJvcHMABAkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcHJvcHMABQUDbmlsCQETZGlzdHJpYnV0ZUJ5V2VpZ2h0cwIFBXRvdGFsBQFyARFzdWJ0cmFjdE1hdGVyaWFscwMMc2hvdWxkVXNlTWF0A2hhcwl0b3RhbE5lZWQEBG5lZWQJARJnZXROZWVkZWRNYXRlcmlhbHMBBQl0b3RhbE5lZWQKAQpzdWJ0cmFjdG9yAgNhY2MDaWR4BAZyZXN1bHQJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaGFzBQNpZHgJAJEDAgUEbmVlZAUDaWR4AwkAZgIAAAUGcmVzdWx0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICGE5vdCBlbm91Z2ggbWF0ZXJpYWwgaWR4PQkApAMBBQNpZHgCCywgeW91IGhhdmUgCQCRAwIFA2hhcwUDaWR4AgssIGJ1dCBuZWVkIAkApAMBCQCRAwIFBG5lZWQFA2lkeAkAzQgCBQNhY2MJAKQDAQUGcmVzdWx0AwUMc2hvdWxkVXNlTWF0CgACJGwFBUlURVI2CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpzdWJ0cmFjdG9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBQNoYXMBEXN1YnRyYWN0RXF1aXBtZW50AgVvbGRFcQVwVXNlZAMJAAACBQVwVXNlZAIACQCUCgIFBW9sZEVxBwoBB3N1YlVzZWQCA2FjYwZpZHhBbXQEBXBhcnRzCQC1CQIFBmlkeEFtdAIBLAMJAQIhPQIJAJADAQUFcGFydHMAAgkAAgECKEluY29ycmVjdCBmb3JtYXQsIHNob3VsZCBiZSBpbmRleCxhbW91bnQEA2lkeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAADAwkAZgIAAAUDaWR4BgkAZwIFA2lkeAkAkAMBBRBwcm9kdWN0aW9uTWF0cml4CQACAQITVW5rbm93biBwcm9kdWN0IGlkeAQDYW10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQQHZXFQYXJ0cwkAtQkCCAUDYWNjAl8xCQCsAgIJAJEDAgUFcGFydHMAAAIBOgMJAQIhPQIJAJADAQUHZXFQYXJ0cwACCQACAQkArAICCQCsAgICD1lvdSBkb24ndCBoYXZlIAkAkQMCBQlwcm9kVHlwZXMFA2lkeAIJIGVxdWlwcGVkBAN0bXAJAJEDAgUHZXFQYXJ0cwABBAZudW1MZW4DCQEHaXNEaWdpdAEJAK8CAgkAsAICBQN0bXAAAQABAAIAAQQEY3VycgkBDXBhcnNlSW50VmFsdWUBCQCvAgIFA3RtcAUGbnVtTGVuBAR0YWlsCQCwAgIFA3RtcAUGbnVtTGVuBAZuZXdBbXQDCQBnAgUEY3VycgUDYW10CQBlAgUEY3VycgUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDVlvdSBlcXVpcHBl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Y2VlZHMgNwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAQpwbGFjZVByb2RCBgZpZHhDbnQFcExpc3QKaXNQb3NpdGl2ZQlkdWNrU3RhdHMIb2NjdXBpZWQEZnJlZQQFcGFydHMJALUJAgUGaWR4Q250AgE6AwkBAiE9AgkAkAMBBQVwYXJ0cwACCQACAQIoSW5jb3JyZWN0IGZvcm1hdCwgc2hvdWxkIGJlIGluZGV4OmFtb3VudAMDCQEBIQEFCmlzUG9zaXRpdmUJAQIhPQIJALECAQkAkQMCBQVwYXJ0cwAAAAIHCQACAQIrUHJvZHVjdCBpZHggc2hvdWxkIGJlIDIgZGlnaXRzLCB6ZXJvIHBhZGRlZAQKcHJvZHVjdElkeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAAEBWNvdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFEGZvcnRBbGxvd2VkUHJvZHMFCnByb2R1Y3RJZHgJAAIBCQCsAgIJAKwCAgIJUHJvZHVjdCAnCQCRAwIFCXByb2RUeXBlcwUKcHJvZHVjdElkeAIhJyBjYW5ub3QgYmUgdXNlZCBmb3IgbGFuZCBkZWZlbnNlAwkAZgIAAAUFY291bnQJAAIBAhdDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZQMJAGYCBQVjb3VudAUNTUFYUFJPRElOU0xPVAkAAgEJAKwCAgkArAICCQCsAgICFENhbid0IHB1dCBtb3JlIHRoYW4gCQCkAwEFDU1BWFBST0RJTlNMT1QCBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQpwcm9kdWN0SWR4AwkAAAIFBWNvdW50AAAJAJUKAwUFcExpc3QFCG9jY3VwaWVkBQRmcmVlBARoZWFkCQDJAQIFBXBMaXN0CQBoAgAIBQpwcm9kdWN0SWR4BARjdXJyCQCxCQEJAMkBAgkAygECBQVwTGlzdAkAaAIACAUKcHJvZHVjdElkeAAIBAR0YWlsCQDKAQIFBXBMaXN0CQBoAgAICQBkAgUKcHJvZHVjdElkeAABBAZyZWNpcGUJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4BQpwcm9kdWN0SWR4AgFfAwMJAQEhAQUKaXNQb3NpdGl2ZQkAZgIFBWNvdW50BQRjdXJyBwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglZb3UgaGF2ZSAJAKQDAQUEY3VycgIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFCnByb2R1Y3RJZHgCEywgYnV0IHRyaWVkIHRvIHVzZSAJAKQDAQUFY291bnQEBm5ld0FtdAMDCQEBIQEFCmlzUG9zaXRpdmUJARVjaGVja1N0YXRSZXF1aXJlbWVudHMCBQlkdWNrU3RhdHMJALUJAgkAkQMCBQZyZWNpcGUFEHJJZHhSZXF1aXJlbWVudHMCASwHCQBlAgUEY3VycgUFY291bnQJAGQCBQRjdXJyBQVjb3VudAQIZGVsdGFWb2wJAGUCCQEIdG9Wb2x1bWUCBQZuZXdBbXQFDlBST0RVQ1RQS0dTSVpFCQEIdG9Wb2x1bWUCBQRjdXJyBQ5QUk9EVUNUUEtHU0laRQkAlQoDCQDLAQIJAMsBAgUEaGVhZAkAmgMBBQZuZXdBbXQFBHRhaWwJAGQCBQhvY2N1cGllZAUIZGVsdGFWb2wJAGUCBQRmcmVlBQhkZWx0YVZvbAEIYWRkUHJvZEIHBmlkeENudAVwTGlzdAppc1Bvc2l0aXZlB3NlZ21lbnQHbWFpbkF1eARzbG90CWR1Y2tTdGF0cwQFcGFydHMJALUJAgUGaWR4Q250AgE6AwkBAiE9AgkAkAMBBQVwYXJ0cwACCQACAQIoSW5jb3JyZWN0IGZvcm1hdCwgc2hvdWxkIGJlIGluZGV4OmFtb3VudAMDCQEBIQEFCmlzUG9zaXRpdmUJAQIhPQIJALECAQkAkQMCBQVwYXJ0cwAAAAIHCQACAQIrUHJvZHVjdCBpZHggc2hvdWxkIGJlIDIgZGlnaXRzLCB6ZXJvIHBhZGRlZAQKcHJvZHVjdElkeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAAEBWNvdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQMDCQBmAgAABQpwcm9kdWN0SWR4BgkAZwIFCnByb2R1Y3RJZHgJAJADAQUQcHJvZHVjdGlvbk1hdHJpeAkAAgECE1Vua25vd24gcHJvZHVjdCBpZHgDCQBmAgAABQVjb3VudAkAAgECF0NvdW50IGNhbid0IGJlIG5lZ2F0aXZlAwkAZgIFBWNvdW50BQ1NQVhQUk9ESU5TTE9UCQACAQkArAICCQCsAgIJAKwCAgIUQ2FuJ3QgcHV0IG1vcmUgdGhhbiAJAKQDAQUNTUFYUFJPRElOU0xPVAIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFCnByb2R1Y3RJZHgDCQAAAgUFY291bnQAAAkAlAoCBQVwTGlzdAcEBGhlYWQJAMkBAgUFcExpc3QJAGgCAAgFCnByb2R1Y3RJZHgEBGN1cnIJALEJAQkAyQECCQDKAQIFBXBMaXN0CQBoAgAIBQpwcm9kdWN0SWR4AAgEBHRhaWwJAMoBAgUFcExpc3QJAGgCAAgJAGQCBQpwcm9kdWN0SWR4AAEEBnJlY2lwZQkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgCAV8DAwkBASEBBQppc1Bvc2l0aXZlCQBmAgUFY291bnQFBGN1cnIHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkApAMBBQRjdXJyAgQgb2YgCQCRAwIFCXByb2RUeXBlcwUKcHJvZHVjdElkeAITLCBidXQgdHJpZWQgdG8gdXNlIAkApAMBBQVjb3VudAQJaXNCaWdJdGVtAwMJAQEhAQUKaXNQb3NpdGl2ZQkBFWNoZWNrU3RhdFJlcXVpcmVtZW50cwIFCWR1Y2tTdGF0cwkAtQkCCQCRAwIFBnJlY2lwZQUQcklkeFJlcXVpcmVtZW50cwIBLAcEBmNvbXBhdAkAkQMCBQZyZWNpcGUFCXJJZHhTbG90cwMJAAACBQZjb21wYXQCAAkAAgECF0l0ZW0gY2Fubm90IGJlIGVxdWlwcGVkBAFjCQENcGFyc2VJbnRWYWx1ZQEFBmNvbXBhdAQEY1NlZwkAaQIFAWMAZAMJAQIhPQIFB3NlZ21lbnQFBGNTZWcJAAIBAhRTZWdtZW50IGluY29tcGF0aWJsZQQIY01haW5BdXgJAGkCCQBqAgUBYwBkAAoDCQECIT0CBQdtYWluQXV4BQhjTWFpbkF1eAkAAgECEVNsb3QgaW5jb21wYXRpYmxlBAljTnVtU2xvdHMJAGoCBQFjAAoDAwkBAiE9AgUEc2xvdAAACQBmAgUJY051bVNsb3RzAAEHCQACAQIeQmlnIGl0ZW1zIHNob3VsZCBvY2N1cHkgc2xvdCAwCQBmAgUJY051bVNsb3RzAAEHCQCUCgIJAMsBAgkAywECBQRoZWFkCQCaAwEJAGQCBQRjdXJyAwUKaXNQb3NpdGl2ZQUFY291bnQJAQEtAQUFY291bnQFBHRhaWwFCWlzQmlnSXRlbQELc2xvdHNHcm91cEIGAWcEYnBJbgppc1Bvc2l0aXZlB3NlZ21lbnQHbWFpbkF1eAVzdGF0cwMJAQIhPQIFAWcCAAQFc2xvdHMJALUJAgUBZwIBLAMJAGYCCQCQAwEFBXNsb3RzBQhNQVhTTE9UUwkAAgECEldyb25nIHNsb3RzIGZvcm1hdAQCczAJAJEDAgUFc2xvdHMAAAQCczEDCQBmAgkAkAMBBQVzbG90cwABCQCRAwIFBXNsb3RzAAECAAMDCQAAAgUCczACAAkAAAIFAnMxAgAHBQRicEluBAV0bXBTMAMJAQIhPQIFAnMwAgAJAQhhZGRQcm9kQgcFAnMwBQRicEluBQppc1Bvc2l0aXZlBQdzZWdtZW50BQdtYWluQXV4AAAFBXN0YXRzCQCUCgIFBGJwSW4HAwkBAiE9AgUCczECAAMIBQV0bXBTMAJfMgkAAgECHkJpZyBpdGVtIGFscmVhZHkgb2NjdXBpZXMgc2xvdAgJAQhhZGRQcm9kQgcFAnMxCAUFdG1wUzACXzEFCmlzUG9zaXRpdmUFB3NlZ21lbnQFB21haW5BdXgAAQUFc3RhdHMCXzEIBQV0bXBTMAJfMQUEYnBJbgEGZHJlc3NCBAdzZWdMaXN0BnBCeXRlcwppc1Bvc2l0aXZlBXN0YXRzCgEHc2VnbWVudAIDYWNjA3NlZwQBaggFA2FjYwJfMQQHbWFpbkF1eAkAtQkCBQNzZWcCATsDCQECIT0CCQCQAwEFB21haW5BdXgFCk5VTU1BSU5BVVgJAAIBAhRXcm9uZyBzZWdtZW50IGZvcm1hdAQBbQkAkQMCBQdtYWluQXV4AAAEAWEJAJEDAgUHbWFpbkF1eAABAwMJAAACBQFtAgAJAAACBQFhAgAHCQCUCgIJAGQCBQFqAAEIBQNhY2MCXzIEBHRtcE0JAQtzbG90c0dyb3VwQgYFAW0IBQNhY2MCXzIFCmlzUG9zaXRpdmUFAWoAAAUFc3RhdHMJAJQKAgkAZAIFAWoAAQkBC3Nsb3RzR3JvdXBCBgUBYQUEdG1wTQUKaXNQb3NpdGl2ZQUBagABBQVzdGF0cwgKAAIkbAUHc2VnTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQZwQnl0ZXMKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3NlZ21lbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYCXzIBBWZvcnRCBgdzZWdMaXN0BnBCeXRlcwhvY2N1cGllZARmcmVlCmlzUG9zaXRpdmUJZHVja1N0YXRzAwkAZgIAAwkAkAMBBQdzZWdMaXN0CQACAQIxQXQgbGVhc3QgZHVjaywgbWluZXMgYW5kIHRyYXBzIHBhcnRzIGFyZSByZXF1aXJlZAoBB3NlZ21lbnQCA2FjYwNzZWcEAWoIBQNhY2MCXzEDCQAAAgUBagAACQCWCgQJAGQCBQFqAAEIBQNhY2MCXzIIBQNhY2MCXzMIBQNhY2MCXzQEAXAJAQpwbGFjZVByb2RCBgUDc2VnCAUDYWNjAl8yBQppc1Bvc2l0aXZlBQlkdWNrU3RhdHMIBQNhY2MCXzMIBQNhY2MCXzQJAJYKBAkAZAIFAWoAAQgFAXACXzEIBQFwAl8yCAUBcAJfMwQBdAoAAiRsBQdzZWdMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAFBnBCeXRlcwUIb2NjdXBpZWQFBGZyZWUKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3NlZ21lbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJUKAwgFAXQCXzIIBQF0Al8zCAUBdAJfNAEXY2FuV2VhckN1cnJlbnRFcXVpcG1lbnQBC2R1Y2tBc3NldElkBAVlcUtleQkBEGtleUR1Y2tFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAQGY3VyckVxCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUFZXFLZXkCFyw7LF8sOyxfLDssXyw7LF8sOyxfLDssAgFfBAl0ZW1wUHJvZEIJAQZkcmVzc0IEBQZjdXJyRXEFDEVNUFRZX1BST0Q1MAYFA25pbAQIc2VnQnBBdXgJAJEDAgkAtQkCCQCRAwIFBmN1cnJFcQULc2VnQmFja3BhY2sCATsAAQQKYnVmZkVmZmVjdAMJAAACBQhzZWdCcEF1eAIAAAAEBGF1eDAJAJEDAgkAtQkCBQhzZWdCcEF1eAIBLAAAAwkAAAIFBGF1eDACAAAABAZpZHhDbnQJALUJAgUEYXV4MAIBOgQDaWR4CQCRAwIFBmlkeENudAAABANjbnQJAJEDAgUGaWR4Q250AAEDAwMDAwkAAAIFA2lkeAICMDYGCQAAAgUDaWR4AgIwNwYJAAACBQNpZHgCAjA4CQECIT0CBQNjbnQCAAcJAGYCCQENcGFyc2VJbnRWYWx1ZQEFA2NudAAABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4CQENcGFyc2VJbnRWYWx1ZQEFA2lkeAIBXwUKcklkeEVmZmVjdAAABAVzdGF0cwkBDGdldER1Y2tTdGF0cwQFBHRoaXMFC2R1Y2tBc3NldElkBQpidWZmRWZmZWN0BgQIbmV3UHJvZEIJAQZkcmVzc0IEBQZjdXJyRXEFCXRlbXBQcm9kQgcFBXN0YXRzCQAAAgUIbmV3UHJvZEIFCG5ld1Byb2RCARl1cGRhdGVQcm9wb3J0aW9uc0ludGVybmFsBAhwcm9wTGlzdA10ZXJyYWluQ291bnRzDWxhbmRTaXplSW5kZXgEc2lnbgMJAQIhPQIJAJADAQUIcHJvcExpc3QFBk5VTVJFUwkAAgECFldyb25nIHByb3BvcnRpb25zIGRhdGEKAQd1cGRhdGVyAgNhY2MBaQQGcmVzdWx0CQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCHByb3BMaXN0BQFpCQBoAgkAaAIFBHNpZ24JAJEDAgUNdGVycmFpbkNvdW50cwUBaQUNbGFuZFNpemVJbmRleAMJAGYCAAAFBnJlc3VsdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIWUGFuaWMhIFBpZWNlcyBvZiB0eXBlPQkApAMBBQFpAgcsIHNpZ249CQCkAwEFBHNpZ24CEywgdGVycmFpbkNvdW50c1tpXT0JAKQDAQkAkQMCBQ10ZXJyYWluQ291bnRzBQFpAhAsIGxhbmRTaXplSW5kZXg9CQCkAwEFDWxhbmRTaXplSW5kZXgJAM0IAgUDYWNjCQCkAwEFBnJlc3VsdAoAAiRsBQVJVEVSNgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHdXBkYXRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgERdXBkYXRlUHJvcG9ydGlvbnMDDXRlcnJhaW5Db3VudHMNbGFuZFNpemVJbmRleARzaWduBAhwcm9wTGlzdAkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJARFrZXlSZXNQcm9wb3J0aW9ucwACCzBfMF8wXzBfMF8wAgFfCQC5CQIJARl1cGRhdGVQcm9wb3J0aW9uc0ludGVybmFsBAUIcHJvcExpc3QFDXRlcnJhaW5Db3VudHMFDWxhbmRTaXplSW5kZXgFBHNpZ24CAV8BDWNvdW50VGVycmFpbnMBCHRlcnJhaW5zCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUEAAQkAzAgCCQBl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dXNlT2NjdXBpZWRWb2wBBQJ3aAQGd2hMb2Z0AwkAZgIABQkAkAMBBQJ3aAkAuQkCCQDMCAICATAJAMwIAgkApAMBBQp3aE9jY3VwaWVkCQDMCAIJAKQDAQkAZQIFB3doVG90YWwFCndoT2NjdXBpZWQJAMwIAgkApAMBBQd3aFRvdGFsBQNuaWwCAV8EBGxvZnQJALUJAgkAkQMCBQJ3aAUJd2hJZHhMT0ZUAgFfBAh3aExvY2tlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFCXZvbExvY2tlZAQDb2NjAwkAZgIJAJADAQUEbG9mdAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAULdm9sT2NjdXBpZWQFCndoT2NjdXBpZWQJALkJAgkAzAgCCQCkAwEFCHdoTG9ja2VkCQDMCAIJAKQDAQUDb2NjCQDMCAIJAKQDAQkAZQIJAGUCBQd3aFRvdGFsBQh3aExvY2tlZAUDb2NjCQDMCAIJAKQDAQUHd2hUb3RhbAUDbmlsAgFfCQDMCAIJAJEDAgUCd2gFC3doSWR4TGV2ZWxzCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUCd2gFCHdoSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUCd2gFCHdoSWR4UmVzAgswXzBfMF8wXzBfMAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAndoBQh3aElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAndoBQh3aElkeE1hdAILMF8wXzBfMF8wXzAJAMwIAgkAkQMCBQJ3aAUJd2hJZHhQcm9kCQDMCAIFBndoTG9mdAUDbmlsARVnZXRXYXJlaG91c2VTcGFjZUxlZnQBCWN1cnJlbnRXaAQLb2NjdXBpZWRWb2wJARdnZXRXYXJlaG91c2VPY2N1cGllZFZvbAEFCWN1cnJlbnRXaAQPY3VycldoTG9ja2VkVm9sCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBQl2b2xMb2NrZWQJAGUCCQBlAgkBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzBQtvY2N1cGllZFZvbAUPY3VycldoTG9ja2VkVm9sAQltb3ZlU3R1ZmYDCmNhcmdvUGFydHMJY3VycmVudFdoC2N1cnJlbnRQYWNrAwkBAiE9AgkAkAMBBQpjYXJnb1BhcnRzAAMJAAIBAjRjYXJnb0xpc3RTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhyZXNQYXJ0cwkAtQkCCQCRAwIFCmNhcmdvUGFydHMAAAIBXwQIbWF0UGFydHMJALUJAgkAkQMCBQpjYXJnb1BhcnRzAAECAV8ECXByb2RQYXJ0cwMJAAACCQCRAwIFCmNhcmdvUGFydHMAAgIABQNuaWwJALwJAgkAkQMCBQpjYXJnb1BhcnRzAAICAV8DCQECIT0CCQCQAwEFCHJlc1BhcnRzBQZOVU1SRVMJAAIBAiBBbGwgNiByZXNvdXJjZXMgc2hvdWxkIGJlIHBhc3NlZAMJAQIhPQIJAJADAQUIbWF0UGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IG1hdGVyaWFscyBzaG91bGQgYmUgcGFzc2VkBAt3aFNwYWNlTGVmdAkBFWdldFdhcmVob3VzZVNwYWNlTGVmdAEFCWN1cnJlbnRXaAQJY3VycldoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQJY3VycldoTWF0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQKY3VycldoUHJvZAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBA5jdXJyZW50UGFja1JlcwkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQOY3VycmVudFBhY2tNYXQJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ED2N1cnJlbnRQYWNrUHJvZAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwoBA212UgIDYWNjBGl0ZW0EAWkIBQNhY2MCXzEEAmFtCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0EA3docgkB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MQIFBSRhY2MwAAAAAQACAAMABAAFAAYKAQNtdlACA2FjYwRpdGVtBAFpCAUDYWNjAl8xBAJhbQkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAN3aHADCQBmAgkAkAMBBQpjdXJyV2hQcm9kBQFpCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKY3VycldoUHJvZAUBaQAABANicHADCQBmAgkAkAMBBQ9jdXJyZW50UGFja1Byb2QFAWkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ9jdXJyZW50UGFja1Byb2QFAWkAAAMJAAACBQJhbQAACQCWCgQJAGQCBQFpAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aHAJAM0IAggFA2FjYwJfMwkApAMBBQNicHAIBQNhY2MCXzQDCQBmAgUCYW0AAAMJAGYCBQJhbQUDYnBwCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgBQRpdGVtAhkgZnJvbSBiYWNrcGFjaywgYnV0IG9ubHkgCQCkAwEFA2JwcAIKIGF2YWlsYWJsZQQIZGVsdGFWb2wJAGUCCQEIdG9Wb2x1bWUCCQBkAgUDd2hwBQJhbQUOUFJPRFVDVFBLR1NJWkUJAQh0b1ZvbHVtZQIFA3docAUOUFJPRFVDVFBLR1NJWkUJAJYKBAkAZAIFAWkAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCBQN3aHAFAmFtCQDNCAIIBQNhY2MCXzMJAKQDAQkAZQIFA2JwcAUCYW0JAGQCCAUDYWNjAl80BQhkZWx0YVZvbAMJAGYCCQEBLQEFAmFtBQN3aHAJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQJhbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUDd2hwAgogYXZhaWxhYmxlBAhkZWx0YVZvbAkAZQIJAQh0b1ZvbHVtZQIJAGQCBQN3aHAFAmFtBQ5QUk9EVUNUUEtHU0laRQkBCHRvVm9sdW1lAgUDd2hwBQ5QUk9EVUNUUEtHU0laRQkAlgoECQBkAgUBaQABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIFA3docAUCYW0JAM0IAggFA2FjYwJfMwkApAMBCQBlAgUDYnBwBQJhbQkAZAIIBQNhY2MCXzQFCGRlbHRhVm9sBAFwAwkBAiE9AgkAkAMBBQlwcm9kUGFydHMAAAoAAiRsBQlwcm9kUGFydHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAUDbmlsBQNuaWwIBQFtAl80CgEFJGYyXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNtdlACBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjJfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYyXzICCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgkAlgoEAAAFCmN1cnJXaFByb2QFD2N1cnJlbnRQYWNrUHJvZAgFAW0CXzQECHZvbFNhbGRvCAUBcAJfNAMJAGYCBQh2b2xTYWxkbwULd2hTcGFjZUxlZnQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICFUF0dGVtcHQgdG8gcHV0IHRvdGFsIAkApAMBBQh2b2xTYWxkbwIRIHN0dWZmLCBidXQgb25seSAJAKQDAQULd2hTcGFjZUxlZnQCFSB3YXJlaG91c2Ugc3BhY2UgbGVmdAkAmQoHCQC5CQIIBQFyAl8yAgFfCQC5CQIIBQFtAl8yAgFfCQC6CQIIBQFwAl8yAgFfCQC5CQIIBQFyAl8zAgFfCQC5CQIIBQFtAl8zAgFfCQC6CQIIBQFwAl8zAgFfBQh2b2xTYWxkbwESZXhwZWRpdGlvbkludGVybmFsAgZjYWxsZXIEdHhJZAQIdXNlckFkZHIJAKUIAQUGY2FsbGVyBAZiaWdOdW0JAQNhYnMBCQCeAwEFBHR4SWQEB2ZyZWVOdW0JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleU5leHRGcmVlTGFuZE51bQAJAGQCBQ9QUkVTQUxFTlVNTEFORFMAAQQHbGFuZE51bQkApAMBBQdmcmVlTnVtBAxjb250aW5lbnRJZHgJAKADAQkAuwICBQZiaWdOdW0FBUZJVkVYBAh0ZXJyYWlucwkBC2dlblRlcnJhaW5zAgUGYmlnTnVtBQxjb250aW5lbnRJZHgECWNvbnRpbmVudAkAkQMCBQpjb250aW5lbnRzBQxjb250aW5lbnRJZHgEBWlzc3VlCQDCCAUJAQduZnROYW1lAgUHbGFuZE51bQIBUwkAuQkCCQDMCAIFB2xhbmROdW0JAMwIAgIBUwkAzAgCBQh0ZXJyYWlucwkAzAgCBQljb250aW5lbnQFA25pbAIBXwABAAAHBAdhc3NldElkCQC4CAEFBWlzc3VlBAJpZAkA2AQBBQdhc3NldElkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlOZXh0RnJlZUxhbmROdW0ACQBkAgUHZnJlZU51bQABCQDMCAIFBWlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlMYW5kVG9Bc3NldElkAQUHbGFuZE51bQUCaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFAmlkBQh1c2VyQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFuZE51bVRvT3duZXIBBQdsYW5kTnVtBQh1c2VyQWRkcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQJpZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEea2V5SW5mcmFMZXZlbEJ5QXNzZXRJZEFuZE93bmVyAgUCaWQFCHVzZXJBZGRyAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyAAEFB2Fzc2V0SWQFA25pbAkAlAoCBQJpZAUJY29udGluZW50AQxmbGlnaHRDb21tb24DCHVzZXJBZGRyB21lc3NhZ2UDc2lnAwkBASEBCQDEEwMFB21lc3NhZ2UFA3NpZwUDcHViCQACAQIYc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoBAVwYXJ0cwkAvAkCCQCwCQEFB21lc3NhZ2UCATsECWZsaWdodExvZwkAvAkCCQCRAwIFBXBhcnRzAAACAXwEAmhwCQC1CQIJAJEDAgUJZmxpZ2h0TG9nBQhmbEhlYWx0aAIBXwQFY3VySFAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJocAAABAVuZXdIUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmhwAAEEC25ld0xvY1R4VmVyCQC1CQIJAJEDAgUFcGFydHMAAQIBOgQLbmV3TG9jYXRpb24JAJEDAgULbmV3TG9jVHhWZXIAAAQEdGltZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWZsaWdodExvZwULZmxUaW1lc3RhbXADAwkAZgIFBHRpbWUJAGQCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAURRklWRU1JTlVURVNNSUxMSVMGCQBmAgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBRFGSVZFTUlOVVRFU01JTExJUwUEdGltZQkAAgEJAKwCAgkArAICCQCsAgICHHNpZ25hdHVyZSBvdXRkYXRlZDogbG9nVGltZT0JAKQDAQUEdGltZQIJLCBiY1RpbWU9CQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAl0eEZyb21Nc2cJAJEDAgULbmV3TG9jVHhWZXIAAQQGbGFzdFR4CQELdmFsdWVPckVsc2UCCQCiCAEJARFrZXlMYXN0VHhJZEJ5VXNlcgEFCHVzZXJBZGRyAgADCQECIT0CBQZsYXN0VHgFCXR4RnJvbU1zZwkAAgEJAKwCAgkArAICCQCsAgICHlR4IGlkcyBkb24ndCBtYXRjaCEgSW4gc3RhdGU6IAUGbGFzdFR4AgosIGluIG1zZzogBQl0eEZyb21Nc2cEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUIdXNlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAQFbWF4SFAJAQltYXhIZWFsdGgBCQELdmFsdWVPckVsc2UCCQCfCAEJAQxrZXlEdWNrTGV2ZWwBBQtkdWNrQXNzZXRJZAAABAxvbGRGcm9tU3RhdGUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoBQVtYXhIUAMJAQIhPQIFDG9sZEZyb21TdGF0ZQUFY3VySFAJAAIBCQCsAgIJAKwCAgkArAICAgpvbGRIZWFsdGg9CQCkAwEFDG9sZEZyb21TdGF0ZQIvIGZyb20gc3RhdGUgZG9lcyBub3QgbWF0Y2ggb25lIGZyb20gZmxpZ2h0IGxvZz0JAKQDAQUFY3VySFADCQBnAgAABQVjdXJIUAkAAgECHllvdSBjYW4ndCBmbHkgd2l0aCB6ZXJvIGhlYWx0aAMJAQEhAQkBF2NhbldlYXJDdXJyZW50RXF1aXBtZW50AQULZHVja0Fzc2V0SWQJAAIBAhZFcXVpcG1lbnQgaW5jb21wYXRpYmxlBAVib251cwMJAGYCCQCQAwEFCWZsaWdodExvZwUHZmxCb251cwkAkQMCBQlmbGlnaHRMb2cFB2ZsQm9udXMCAAQIcHJvZFVzZWQDCQBmAgkAkAMBBQlmbGlnaHRMb2cFC2ZsUHJvZHNVc2VkCQCRAwIFCWZsaWdodExvZwULZmxQcm9kc1VzZWQCAAQKc2VudEFtb3VudAMDCQBmAgUFbmV3SFAAAAkAAAIFBWJvbnVzAgEkBwkBBWFzSW50AQkA/AcEBQxyZXN0Q29udHJhY3QCDXNlbmRVc2R0UHJpemUJAMwIAgUIdXNlckFkZHIFA25pbAUDbmlsAAAJAJcKBQUFbmV3SFAFC2R1Y2tBc3NldElkBQpzZW50QW1vdW50BQtuZXdMb2NhdGlvbgUIcHJvZFVzZWQBDGFwcGx5Qm9udXNlcwILbGFuZEFzc2V0SWQGcGllY2VzBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAQJYXJ0UGllY2VzCQELdmFsdWVPckVsc2UCCQCfCAEJASBrZXlMYW5kQXJ0U3RhdHVzQnlUeXBlQW5kQXNzZXRJZAIFCkFSVFBSRVNBTEUFC2xhbmRBc3NldElkAAAEBGFkZDYJAGkCBQppbmZyYUxldmVsAAYEBGFkZDcJAGkCBQppbmZyYUxldmVsAAcJAGQCCQBkAgUPREFJTFlSRVNCWVBJRUNFCQBrAwUPREFJTFlSRVNCWVBJRUNFCQBkAgkAZAIFCmluZnJhTGV2ZWwFBGFkZDYJAGgCAAIFBGFkZDcABQkAawMFD0RBSUxZUkVTQllQSUVDRQUJYXJ0UGllY2VzCQBoAgUGcGllY2VzAAUBFGNoZWNrQ2xhaW1Db25kaXRpb25zAwRhZGRyCWNsYWltTW9kZQ1sYW5kQXNzZXRJZEluBA0kdDAzMzczODM0Mjc3AwkAAAIFCWNsYWltTW9kZQULY2xhaW1Nb2RlV2gJAJQKAgUNbGFuZEFzc2V0SWRJbgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAgAEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04EA2xvYwkAtQkCCQEFdmFsdWUBBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFMCQACAQkArAICCQCsAgICFkR1Y2sgbG9jYXRpb24gdHlwZSBpcyAJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAhEsIGJ1dCBzaG91bGQgYmUgTAkAlAoCCQCRAwIFA2xvYwUIbG9jSWR4SWQFC2R1Y2tBc3NldElkBAtsYW5kQXNzZXRJZAgFDSR0MDMzNzM4MzQyNzcCXzEEBmR1Y2tJZAgFDSR0MDMzNzM4MzQyNzcCXzIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQECXNhdmVkVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFB3RpbWVLZXkJAKwCAgkArAICAgVMYW5kIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQBZAkAtQkCCAUFYXNzZXQLZGVzY3JpcHRpb24CAV8JAJYKBAUGZHVja0lkBQtsYW5kQXNzZXRJZAUBZAUJc2F2ZWRUaW1lARBjbGFpbVJlc0ludGVybmFsBARhZGRyBmFtb3VudAljbGFpbU1vZGUNbGFuZEFzc2V0SWRJbgMJAGYCAAAFBmFtb3VudAkAAgECD05lZ2F0aXZlIGFtb3VudAQBYwkBFGNoZWNrQ2xhaW1Db25kaXRpb25zAwUEYWRkcgUJY2xhaW1Nb2RlBQ1sYW5kQXNzZXRJZEluBAhsYW5kU2l6ZQkAkQMCCAUBYwJfMwULcmVjTGFuZFNpemUEDXRlcnJhaW5Db3VudHMJAQ1jb3VudFRlcnJhaW5zAQkAkQMCCAUBYwJfMwULcmVjVGVycmFpbnMECWRlbHRhVGltZQkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCAUBYwJfNAMJAGYCAAAFCWRlbHRhVGltZQkAAgEJAKwCAgkArAICCQCsAgICJlNhdmVkIHRpbWVzdGFtcCBpcyBpbiBmdXR1cmUsIHNhdmVkID0gCQCkAwEIBQFjAl80AgwsIGN1cnJlbnQgPSAJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAEBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEFCGxhbmRTaXplBBZkYWlseVByb2R1Y3Rpb25CeVBpZWNlCQEMYXBwbHlCb251c2VzAggFAWMCXzIFBnBpZWNlcwQIYXZhaWxSZXMJAGsDBQlkZWx0YVRpbWUJAGgCBRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlBQZwaWVjZXMFCURBWU1JTExJUwMJAGYCBQZhbW91bnQFCGF2YWlsUmVzCQACAQkArAICCQCsAgIJAKwCAgIiTm90IGVub3VnaCByZXNvdXJjZXMsIGF2YWlsYWJsZSA9IAkApAMBBQhhdmFpbFJlcwIOLCByZXF1ZXN0ZWQgPSAJAKQDAQUGYW1vdW50BAxuZXdEZWx0YVRpbWUJAGsDCQBlAgUIYXZhaWxSZXMFBmFtb3VudAUJREFZTUlMTElTCQBoAgUWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQUGcGllY2VzBAxuZXdUaW1lc3RhbXAJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUMbmV3RGVsdGFUaW1lBAlsYW5kSW5kZXgJAGkCBQZwaWVjZXMFBVNTSVpFBApyZXNUb0NsYWltCQEJdmlydENsYWltBAUNdGVycmFpbkNvdW50cwkAZQIFCWRlbHRhVGltZQUMbmV3RGVsdGFUaW1lBQlsYW5kSW5kZXgFFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UEBXdoS2V5CQESa2V5V2FyZWhvdXNlQnlMYW5kAQgFAWMCXzIECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBCAUBYwJfMgAABAljdXJyZW50V2gJAQxnZXRXYXJlaG91c2UDBQV3aEtleQUJbGFuZEluZGV4BQppbmZyYUxldmVsBARsb2Z0CQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8EC3doU3BhY2VMZWZ0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQMDCQAAAgUJY2xhaW1Nb2RlBQtjbGFpbU1vZGVXaAkAZgIFBmFtb3VudAULd2hTcGFjZUxlZnQHCQACAQkArAICCQCsAgICBU9ubHkgCQCkAwEFC3doU3BhY2VMZWZ0Ahggc3BhY2UgbGVmdCBpbiB3YXJlaG91c2UEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBCAUBYwJfMQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BA5jdXJyZW50UGFja1JlcwkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQMY3VycmVudFdoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQNJHQwMzY2NTEzNzUyMgMJAAACBQljbGFpbU1vZGUFC2NsYWltTW9kZVdoCQCWCgQJAQZhZGRSZXMFBQxjdXJyZW50V2hSZXMFDXRlcnJhaW5Db3VudHMJAGUCBQlkZWx0YVRpbWUFDG5ld0RlbHRhVGltZQUJbGFuZEluZGV4BRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQt2b2xPY2N1cGllZAgFCnJlc1RvQ2xhaW0CXzIJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQgFCnJlc1RvQ2xhaW0CXzIDCQAAAgUJY2xhaW1Nb2RlBQ1jbGFpbU1vZGVEdWNrCQCWCgQJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwkBBmFkZFJlcwUFDmN1cnJlbnRQYWNrUmVzBQ10ZXJyYWluQ291bnRzCQBlAgUJZGVsdGFUaW1lBQxuZXdEZWx0YVRpbWUFCWxhbmRJbmRleAUWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQQFZGlzdHIJAQ1kaXN0cmlidXRlUmVzBAUMY3VycmVudFdoUmVzBQ5jdXJyZW50UGFja1JlcwUKcmVzVG9DbGFpbQULd2hTcGFjZUxlZnQEBHdoQW0JAJcDAQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQkAzAgCCAUKcmVzVG9DbGFpbQJfMgUDbmlsCQCWCgQIBQVkaXN0cgJfMQgFBWRpc3RyAl8yCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkBQR3aEFtCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUFBHdoQW0EBXdoUmVzCAUNJHQwMzY2NTEzNzUyMgJfMQQFYnBSZXMIBQ0kdDAzNjY1MTM3NTIyAl8yBAVsb2Z0TwgFDSR0MDM2NjUxMzc1MjICXzMEBWxvZnRGCAUNJHQwMzY2NTEzNzUyMgJfNAkAlwoFCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEIBQFjAl8yBQxuZXdUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKTEFORFBSRUZJWAgFAWMCXzIFBGFkZHIFDG5ld1RpbWVzdGFtcAUDbmlsBQVicEtleQkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIFBWJwUmVzCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsBQV3aEtleQkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgUFd2hSZXMJAMwIAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0CQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QJAMwIAgkAuQkCCQDMCAIJAJEDAgUEbG9mdAUJdm9sTG9ja2VkCQDMCAIJAKQDAQUFbG9mdE8JAMwIAgkApAMBBQVsb2Z0RgkAzAgCCQCRAwIFBGxvZnQFCHZvbFRvdGFsBQNuaWwCAV8FA25pbAEIY2xhaW1BbGwEBGFkZHILbGFuZEFzc2V0SWQGcGllY2VzCWNsYWltTW9kZQQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAQJc2F2ZWRUaW1lCQEFdmFsdWUBCQCfCAEFB3RpbWVLZXkECGF2YWlsUmVzCQBoAgkAawMJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUJc2F2ZWRUaW1lCQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwUJREFZTUlMTElTBQZwaWVjZXMJARBjbGFpbVJlc0ludGVybmFsBAUEYWRkcgUIYXZhaWxSZXMFCWNsYWltTW9kZQULbGFuZEFzc2V0SWQBDXVwSW5mcmFDb21tb24EDHNob3VsZFVzZU1hdAZjYWxsZXINcGF5bWVudEFtb3VudAtsYW5kQXNzZXRJZAQEYWRkcgkApQgBBQZjYWxsZXIEAWMJARRjaGVja0NsYWltQ29uZGl0aW9ucwMFBGFkZHIFE2NsYWltTW9kZVdoVGhlbkR1Y2sFC2xhbmRBc3NldElkBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIIBQFjAl8zBQtyZWNMYW5kU2l6ZQQIaW5mcmFLZXkJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQgFAWMCXzIECGN1ckxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEFCGluZnJhS2V5AAADAwkBASEBBRhLU19BTExPV19CSUdfSU5GUkFfTUVSR0UJAGcCBQhjdXJMZXZlbAADBwkAAgECJkN1cnJlbnRseSBtYXggaW5mcmFzdHJ1Y3R1cmUgbGV2ZWwgPSAzBAhtYXhJbmZyYQkAZAIJAGkCCQEEc3FydAQFBnBpZWNlcwAAAAAFBERPV04ABQACBAhuZXdMZXZlbAkAZAIFCGN1ckxldmVsAAEDAwUYS1NfQUxMT1dfQklHX0lORlJBX01FUkdFCQBmAgUIbmV3TGV2ZWwFCG1heEluZnJhBwkAAgEJAKwCAgIlQ3VycmVudGx5IG1heCBpbmZyYXN0cnVjdHVyZSBsZXZlbCA9IAkApAMBBQhtYXhJbmZyYQQEY29zdAkAawMFFUluZnJhVXBncmFkZUNvc3RTVXNkdAkAaAIFBnBpZWNlcwUIbmV3TGV2ZWwFBVNTSVpFAwMJAQEhAQUMc2hvdWxkVXNlTWF0CQECIT0CBQ1wYXltZW50QW1vdW50BQRjb3N0BwkAAgEJAKwCAgIbUGF5bWVudCBhdHRhY2hlZCBzaG91bGQgYmUgCQCkAwEFBGNvc3QEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBCAUBYwJfMQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAVtTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQHbWF0VXNlZAkAawMFEUluZnJhVXBncmFkZUNvc3RTCQBoAgUGcGllY2VzBQhuZXdMZXZlbAUFU1NJWkUEBm5ld01hdAkAuQkCCQERc3VidHJhY3RNYXRlcmlhbHMDBQxzaG91bGRVc2VNYXQFBW1MaXN0BQdtYXRVc2VkAgFfBAtjbGFpbVJlc3VsdAkBCGNsYWltQWxsBAUEYWRkcggFAWMCXzIFBnBpZWNlcwUTY2xhaW1Nb2RlV2hUaGVuRHVjawQGd2hEYXRhCAULY2xhaW1SZXN1bHQCXzUEBm9sZFZvbAkBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQkAkQMCBQZ3aERhdGEFC3doSWR4TGV2ZWxzBApuZXdWb2xEYXRhCQC5CQIJAMwIAgkAkQMCCQC1CQIJAJEDAgUGd2hEYXRhBQt3aElkeExldmVscwIBXwAACQDMCAIJAKQDAQUIbmV3TGV2ZWwFA25pbAIBXwQGbmV3Vm9sCQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBBQpuZXdWb2xEYXRhBARsb2Z0CQC1CQIJAJEDAgUGd2hEYXRhBQl3aElkeExPRlQCAV8ECm5ld0xvZnRTdHIJALkJAgkAzAgCCQCRAwIFBGxvZnQFCXZvbExvY2tlZAkAzAgCCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkCQDMCAIJAKQDAQkAZQIJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQUGbmV3Vm9sBQZvbGRWb2wJAMwIAgkApAMBBQZuZXdWb2wFA25pbAIBXwkAlQoDCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFCGluZnJhS2V5BQhuZXdMZXZlbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHmtleUluZnJhTGV2ZWxCeUFzc2V0SWRBbmRPd25lcgIIBQFjAl8yBQRhZGRyBQhuZXdMZXZlbAkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCCAULY2xhaW1SZXN1bHQCXzMFCGJwSWR4UmVzCQDMCAIFBm5ld01hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgkAzAgCCQELU3RyaW5nRW50cnkCCAULY2xhaW1SZXN1bHQCXzQJALkJAgkAzAgCBQpuZXdWb2xEYXRhCQDMCAIJAJEDAgUGd2hEYXRhBQh3aElkeFJlcwkAzAgCCQCRAwIFBndoRGF0YQUId2hJZHhNYXQJAMwIAgkAkQMCBQZ3aERhdGEFCXdoSWR4UHJvZAkAzAgCBQpuZXdMb2Z0U3RyBQNuaWwCAToFA25pbAgFC2NsYWltUmVzdWx0Al8xBQhuZXdMZXZlbAUHbWF0VXNlZAEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCC2R1Y2tBc3NldElkB2RlbHRhWFAEBmx2bEtleQkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkBAV4cEtleQkBCWtleUR1Y2tYUAEFC2R1Y2tBc3NldElkBAJ4cAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV4cEtleQAABAVuZXdYUAkAZAIFAnhwBQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQZsdmxLZXkAAAUFbmV3WFAECWtleVBvaW50cwkBEWtleUR1Y2tGcmVlUG9pbnRzAQULZHVja0Fzc2V0SWQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUGbHZsS2V5CQCRAwIFCWx2bFBvaW50cwAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQV4cEtleQUFbmV3WFAJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleVBvaW50cwkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5UG9pbnRzAAAJAJEDAgUJbHZsUG9pbnRzAAEFA25pbAUFbmV3WFABFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCBGFkZHIHZGVsdGFYUAQGbHZsS2V5CQEMa2V5VXNlckxldmVsAQUEYWRkcgQFeHBLZXkJAQlrZXlVc2VyWFABBQRhZGRyBAJ4cAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV4cEtleQAABAVuZXdYUAkAZAIFAnhwBQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQZsdmxLZXkAAAUFbmV3WFAECWtleVBvaW50cwkBEWtleVVzZXJGcmVlUG9pbnRzAQUEYWRkcgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZsdmxLZXkJAJEDAgUJbHZsUG9pbnRzAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFBXhwS2V5BQVuZXdYUAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa2V5UG9pbnRzCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlQb2ludHMAAAkAkQMCBQlsdmxQb2ludHMAAQUDbmlsBQVuZXdYUAESYWN0aXZhdGVPbmJvYXJkQXJ0AQRhZGRyBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECHJlZkJ5S2V5CQEPa2V5QWRkcmVzc1JlZkJ5AQUEYWRkcgQFcmVmQnkJAKIIAQUIcmVmQnlLZXkDCQEBIQEJAQlpc0RlZmluZWQBBQVyZWZCeQkAAgECKVlvdSBhcmUgbm90IGVsaWdpYmxlIGZvciBPTkJPQVJEIGFydGlmYWN0BAZhcnRLZXkJARxrZXlPbmJvYXJkQXJ0RHVja0FjdGl2YXRlZEJ5AQUEYWRkcgQHYXJ0RHVjawkAoggBBQZhcnRLZXkDCQEJaXNEZWZpbmVkAQUHYXJ0RHVjawkAAgEJAKwCAgIvWW91IGFscmVhZHkgdXNlZCB5b3VyIE9OQk9BUkQgYXJ0aWZhY3Qgb24gZHVjayAJAQV2YWx1ZQEFB2FydER1Y2sEEGR1Y2tBY3RpdmF0b3JLZXkJARxrZXlPbmJvYXJkQXJ0QWN0aXZhdGVkT25EdWNrAQULZHVja0Fzc2V0SWQEDWR1Y2tBY3RpdmF0b3IJAKIIAQUQZHVja0FjdGl2YXRvcktleQMJAQlpc0RlZmluZWQBBQ1kdWNrQWN0aXZhdG9yCQACAQkArAICCQCsAgIJAKwCAgIJVGhlIGR1Y2sgBQtkdWNrQXNzZXRJZAI0IGFscmVhZHkgZ290IHBvaW50cyBmcm9tIE9OQk9BUkQgYXJ0aWZhY3QgZnJvbSB1c2VyIAkBBXZhbHVlAQUNZHVja0FjdGl2YXRvcgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmFydEtleQULZHVja0Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUQZHVja0FjdGl2YXRvcktleQUEYWRkcgUDbmlsCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQFCXhwT25ib2FyZAJfMQESYWN0aXZhdGVQcmVzYWxlQXJ0AgRhZGRyDWxhbmRBc3NldElkSW4EAWMJARRjaGVja0NsYWltQ29uZGl0aW9ucwMFBGFkZHIFE2NsYWltTW9kZVdoVGhlbkR1Y2sFDWxhbmRBc3NldElkSW4EC2xhbmRBc3NldElkCAUBYwJfMgQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCCAUBYwJfMwULcmVjTGFuZFNpemUEDWFjdGl2YXRpb25LZXkJASBrZXlMYW5kQXJ0U3RhdHVzQnlUeXBlQW5kQXNzZXRJZAIFCkFSVFBSRVNBTEUFC2xhbmRBc3NldElkAwkAZgIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNYWN0aXZhdGlvbktleQAAAAAJAAIBAiVQcmVzYWxlIGFydGlmYWN0IGlzIGFscmVhZHkgYWN0aXZhdGVkAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCCAUBYwJfMwUKcmVjTGFuZE51bQUPUFJFU0FMRU5VTUxBTkRTCQACAQkArAICCQCsAgIJAKwCAgUKTEFORFBSRUZJWAIBIAULbGFuZEFzc2V0SWQCJSBpcyBub3QgZWxpZ2libGUgZm9yIHByZXNhbGUgYXJ0aWZhY3QEC2NsYWltUmVzdWx0CQEIY2xhaW1BbGwEBQRhZGRyBQtsYW5kQXNzZXRJZAUGcGllY2VzBRNjbGFpbU1vZGVXaFRoZW5EdWNrCQDNCAIJAM0IAgkAzQgCCAULY2xhaW1SZXN1bHQCXzEJAQxJbnRlZ2VyRW50cnkCBQ1hY3RpdmF0aW9uS2V5BQZwaWVjZXMJAQtTdHJpbmdFbnRyeQIIBQtjbGFpbVJlc3VsdAJfMgkAuQkCCAULY2xhaW1SZXN1bHQCXzMCAToJAQtTdHJpbmdFbnRyeQIIBQtjbGFpbVJlc3VsdAJfNAkAuQkCCAULY2xhaW1SZXN1bHQCXzUCAToBD2NoZWNrVG91cm5hbWVudAELZHVja0Fzc2V0SWQEBmxhc3RJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJ0b3VybmFtZW50Q29udHJhY3QFDWxhc3RUb3VySWRLZXkAAAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFEnRvdXJuYW1lbnRDb250cmFjdAUGbGFzdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAVQHAwMDCQAAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ckxvY2F0aW9uBQ9sb2NJZHhDb250aW5lbnQFBmxhc3RJZAkAAAIJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMCCklOUFJPR1JFU1MHCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAUDbm93BwkAAgECKllvdXIgZHVjayBpcyB0YWtpbmcgcGFydCBpbiB0aGUgdG91cm5hbWVudAkBCWFzQm9vbGVhbgEJAPwHBAUEdGhpcwIWZXhpdFRvdXJuYW1lbnRJbnRlcm5hbAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsBQNuaWwBDWNoZWNrRGVsaXZlcnkBC2R1Y2tBc3NldElkAwkBASEBBRFLU19BTExPV19ERUxJVkVSWQcEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8EA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFEBwQJc3RhcnRUaW1lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAQIZGlzdGFuY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQDAwkAZgIFA25vdwkAZAIFCXN0YXJ0VGltZQUSVEVOX01JTlVURVNfTUlMTElTCQBmAgADBQhkaXN0YW5jZQcJAAIBAiBZb3VyIGR1Y2sgaXMgb24gZGVsaXZlcnkgbWlzc2lvbgkBCWFzQm9vbGVhbgEJAPwHBAUEdGhpcwIUZXhpdERlbGl2ZXJ5SW50ZXJuYWwJAMwIAgULZHVja0Fzc2V0SWQFA25pbAUDbmlsARJleGl0RGVsaXZlcnlDb21tb24EC2R1Y2tBc3NldElkBWNoZWNrBW5ld0hQBXNjb3JlBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlzdGFydFRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAhkaXN0YW5jZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEQa2V5RHVja0lkVG9Pd25lcgEFC2R1Y2tBc3NldElkAhRORlQgZHVjayBpcyBvcnBoYW5lZAQJaGVhbHRoS2V5CQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAljdXJIZWFsdGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEFCWhlYWx0aEtleQQOb3V0Y29tZUFjdGlvbnMDAwkAZwIFCGRpc3RhbmNlAAMGAwMFBWNoZWNrCQBnAgUFc2NvcmUAAwcJAGYCBQVuZXdIUAAABwQGcmV3YXJkCQD8BwQFD2Vjb25vbXlDb250cmFjdAISc2VuZERlbGl2ZXJ5UmV3YXJkCQDMCAIFBW93bmVyBQNuaWwFA25pbAMJAAACBQZyZXdhcmQFBnJld2FyZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwMDBQVjaGVjawkAZgIFBW5ld0hQAAAHCQBmAgkAZAIFCXN0YXJ0VGltZQUSVEVOX01JTlVURVNfTUlMTElTBQNub3cHCQACAQImWW91ciBkdWNrIGlzIHN0aWxsIG9uIGRlbGl2ZXJ5IG1pc3Npb24EC2xvY2tlZFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIFD2Vjb25vbXlDb250cmFjdAURZGVsaXZlcnlMb2NrZWRLZXkAAAQGdW5sb2NrCQD8BwQFD2Vjb25vbXlDb250cmFjdAIUdXBkYXRlRGVsaXZlcnlMb2NrZWQJAMwIAgkAZQIFC2xvY2tlZFRvdGFsBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFA25pbAUDbmlsAwkAAAIFBnVubG9jawUGdW5sb2NrAwMDBQVjaGVjawkAZwIAAAUFbmV3SFAHBgkAZwIAAAUJY3VySGVhbHRoBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlEZWxpdmVyeURlbGF5QnlEdWNrAQULZHVja0Fzc2V0SWQJAGQCBQlzdGFydFRpbWUFE0RFTElWRVJZX1BVTklTSE1FTlQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQLc2F2ZWRIZWFsdGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ5rZXlTYXZlZEhlYWx0aAEFC2R1Y2tBc3NldElkBA1zYXZlZExvY2F0aW9uCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkCQCWCgQFDm91dGNvbWVBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQloZWFsdGhLZXkFC3NhdmVkSGVhbHRoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUNc2F2ZWRMb2NhdGlvbgUDbmlsBQ1zYXZlZExvY2F0aW9uBQtzYXZlZEhlYWx0aAENbWVyZ2VJbnRlcm5hbAYLbmV3TGFuZFNpemUIbmV3TGV2ZWwHZm9ybXVsYQRhZGRyDGxhbmRBc3NldElkcwduZWVkTWF0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAh1tZXJnZUludGVybmFsX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhttZXJnZUludGVybmFsX2NoZWNrRGVsaXZlcnkKAQpjaGVja01lcmdlAgNhY2MLbGFuZEFzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQECXNhdmVkVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFB3RpbWVLZXkJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAFkCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwQJY29udGluZW50CQCRAwIFAWQFDHJlY0NvbnRpbmVudAMDCQECIT0CCAUDYWNjAl8zAgAJAQIhPQIIBQNhY2MCXzMFCWNvbnRpbmVudAcJAAIBAi5MYW5kcyBzaG91bGQgYmUgb24gdGhlIHNhbWUgY29udGluZW50IHRvIG1lcmdlBAhsYW5kU2l6ZQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQHc2l6ZXNJbggFA2FjYwJfMQQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCzCQIFB3NpemVzSW4FCGxhbmRTaXplAidZb3UgaGF2ZW4ndCBwYXNzZWQgYWxsIHRoZSBsYW5kcyBuZWVkZWQECHNpemVzT3V0CQCsAgIJAK8CAgUHc2l6ZXNJbgUBaQkAsAICBQdzaXplc0luCQBkAgUBaQABBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBBQhsYW5kU2l6ZQQEYXJ0cwkAZAIIBQNhY2MCXzIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQAAAQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAAECHJlcUxldmVsBAckbWF0Y2gwBQhsYW5kU2l6ZQMJAAACAgFTBQckbWF0Y2gwAAMDCQAAAgIBTQUHJG1hdGNoMAAEAwkAAAICAUwFByRtYXRjaDAABQMJAAACAgJYTAUHJG1hdGNoMAAGCQACAQIaT25seSBTLCBNLCBMLCBYTCBjYW4gbWVyZ2UDCQECIT0CBQppbmZyYUxldmVsBQhyZXFMZXZlbAkAAgECIkFsbCBsYW5kcyBzaG91bGQgYmUgbWF4ZWQgdG8gbWVyZ2UEB2xhbmROdW0JAJEDAgUBZAUKcmVjTGFuZE51bQQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIFAWQFC3JlY1RlcnJhaW5zBAlkZWx0YVRpbWUJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUJc2F2ZWRUaW1lAwkAZgIAAAUJZGVsdGFUaW1lCQACAQkArAICCQCsAgIJAKwCAgImU2F2ZWQgdGltZXN0YW1wIGlzIGluIGZ1dHVyZSwgc2F2ZWQgPSAJAKQDAQUJc2F2ZWRUaW1lAgwsIGN1cnJlbnQgPSAJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAEFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UJAQxhcHBseUJvbnVzZXMCBQtsYW5kQXNzZXRJZAUGcGllY2VzBAlsYW5kSW5kZXgJAGkCBQZwaWVjZXMFBVNTSVpFBAVicFJlcwkBBmFkZFJlcwUJALUJAggFA2FjYwJfNAIBXwUNdGVycmFpbkNvdW50cwUJZGVsdGFUaW1lBQlsYW5kSW5kZXgFFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UEBXByb3BzCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQIBQNhY2MCXzYFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAD///////////8BBAZjUHJvcHMJARl1cGRhdGVQcm9wb3J0aW9uc0ludGVybmFsBAgFA2FjYwNfMTAFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAD///////////8BBAtzdW1UZXJyYWlucwkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwECAUDYWNjAl85BQ10ZXJyYWluQ291bnRzBQlsYW5kSW5kZXgAAQQFbGFuZHMIBQNhY2MCXzcEA2lkeAkAzwgCBQVsYW5kcwULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBBQNpZHgJAAIBCQCsAgICIFlvdXIgc3Rha2VkIGxhbmRzIGRvbid0IGNvbnRhaW4gBQtsYW5kQXNzZXRJZAQJY3VzdG9tS2V5CQEaa2V5TGFuZEFzc2V0SWRUb0N1c3RvbU5hbWUBBQtsYW5kQXNzZXRJZAQKY3VzdG9tTmFtZQkBC3ZhbHVlT3JFbHNlAgkAoggBBQljdXN0b21LZXkCAAkAnAoKBQhzaXplc091dAUEYXJ0cwUJY29udGluZW50BQVicFJlcwkAzggCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAggFA2FjYwJfNQkBC0RlbGV0ZUVudHJ5AQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkBC0RlbGV0ZUVudHJ5AQkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYBQtsYW5kQXNzZXRJZAUEYWRkcgkBC0RlbGV0ZUVudHJ5AQkBEGtleUxhbmRUb0Fzc2V0SWQBBQdsYW5kTnVtCQELRGVsZXRlRW50cnkBCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAQtEZWxldGVFbnRyeQEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAQtEZWxldGVFbnRyeQEJAR5rZXlJbmZyYUxldmVsQnlBc3NldElkQW5kT3duZXICBQtsYW5kQXNzZXRJZAUEYWRkcgkBC0RlbGV0ZUVudHJ5AQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQJAQtEZWxldGVFbnRyeQEJARFrZXlMYW5kTnVtVG9Pd25lcgEFB2xhbmROdW0JAQtEZWxldGVFbnRyeQEJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAkBC0RlbGV0ZUVudHJ5AQUJY3VzdG9tS2V5CQEEQnVybgIJANkEAQULbGFuZEFzc2V0SWQAAQMJAQIhPQIFCmN1c3RvbU5hbWUCAAkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5TGFuZEN1c3RvbU5hbWVUb0Fzc2V0SWQBBQpjdXN0b21OYW1lBQNuaWwFA25pbAUFcHJvcHMJANEIAgUFbGFuZHMJAQV2YWx1ZQEFA2lkeAkAZAIIBQNhY2MCXzgFBnBpZWNlcwULc3VtVGVycmFpbnMFBmNQcm9wcwQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkECHByb3BMaXN0CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBEWtleVJlc1Byb3BvcnRpb25zAAILMF8wXzBfMF8wXzACAV8ECGxhbmRzS2V5CQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUEYWRkcgQIbGFuZHNTdHIJAKIIAQUIbGFuZHNLZXkEB2xhbmRzSW4DCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIJAL0JAgkBBXZhbHVlAQUIbGFuZHNTdHICAV8FA25pbAQFY29udDAJAJEDAgkAtQkCCAkBBXZhbHVlAQkA7AcBCQDZBAEJAJEDAgUMbGFuZEFzc2V0SWRzAAALZGVzY3JpcHRpb24CAV8FDHJlY0NvbnRpbmVudAQJY29udFByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBBQVjb250MAILMF8wXzBfMF8wXzACAV8EAXIKAAIkbAUMbGFuZEFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAnAoKBQdmb3JtdWxhAAACAAkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMFA25pbAUIcHJvcExpc3QFB2xhbmRzSW4AAAkAtQkCAgswXzBfMF8wXzBfMAIBXwUJY29udFByb3BzCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpjaGVja01lcmdlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQJY29udGluZW50CAUBcgJfMwQMY29udGluZW50SWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUKY29udGluZW50cwUJY29udGluZW50CQCsAgICE1Vua25vd24gY29udGluZW50OiAFCWNvbnRpbmVudAQIdGVycmFpbnMJARNnZW5UZXJyYWluc0Zvck1lcmdlAggFAXICXzkJAGkCCQEPbnVtUGllY2VzQnlTaXplAQULbmV3TGFuZFNpemUFBVNTSVpFBAdmcmVlTnVtCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlOZXh0RnJlZUxhbmROdW0ACQBkAgUPUFJFU0FMRU5VTUxBTkRTAAEECm5ld0xhbmROdW0JAKQDAQUHZnJlZU51bQQFaXNzdWUJAMIIBQkBB25mdE5hbWUCBQpuZXdMYW5kTnVtBQtuZXdMYW5kU2l6ZQkAuQkCCQDMCAIFCm5ld0xhbmROdW0JAMwIAgULbmV3TGFuZFNpemUJAMwIAgUIdGVycmFpbnMJAMwIAgUJY29udGluZW50BQNuaWwCAV8AAQAABwQHYXNzZXRJZAkAuAgBBQVpc3N1ZQQObmV3TGFuZEFzc2V0SWQJANgEAQUHYXNzZXRJZAQGbmV3TWF0CQC5CQIJARFzdWJ0cmFjdE1hdGVyaWFscwMJAGYCBQduZWVkTWF0AAAJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8FB25lZWRNYXQCAV8ECXBpZWNlc0tleQkBFmtleVN0YWtlZFBpZWNlc0J5T3duZXIBBQRhZGRyBAxzdGFrZWRQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJcGllY2VzS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAggFAXICXzUDCQBmAgkAkAMBCAUBcgJfNwAACQELU3RyaW5nRW50cnkCBQhsYW5kc0tleQkAuwkCCAUBcgJfNwIBXwkBC0RlbGV0ZUVudHJ5AQUIbGFuZHNLZXkJAQxJbnRlZ2VyRW50cnkCBQlwaWVjZXNLZXkDCQBmAggFAXICXzgFDHN0YWtlZFBpZWNlcwAACQBlAgUMc3Rha2VkUGllY2VzCAUBcgJfOAkBDEludGVnZXJFbnRyeQIJARJrZXlOZXh0RnJlZUxhbmROdW0ACQBkAgUHZnJlZU51bQABBQVpc3N1ZQkBC1N0cmluZ0VudHJ5AgkBEGtleUxhbmRUb0Fzc2V0SWQBBQpuZXdMYW5kTnVtBQ5uZXdMYW5kQXNzZXRJZAkBC1N0cmluZ0VudHJ5AgkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFDm5ld0xhbmRBc3NldElkBQRhZGRyCQELU3RyaW5nRW50cnkCCQERa2V5TGFuZE51bVRvT3duZXIBBQpuZXdMYW5kTnVtBQRhZGRyCQEMSW50ZWdlckVudHJ5AgkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQUObmV3TGFuZEFzc2V0SWQIBQFyAl8yCQEMSW50ZWdlckVudHJ5AgkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQ5uZXdMYW5kQXNzZXRJZAUIbmV3TGV2ZWwJAQxJbnRlZ2VyRW50cnkCCQEea2V5SW5mcmFMZXZlbEJ5QXNzZXRJZEFuZE93bmVyAgUObmV3TGFuZEFzc2V0SWQFBGFkZHIFCG5ld0xldmVsCQELU3RyaW5nRW50cnkCBQVicEtleQkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAggFAXICXzQJAMwIAgUGbmV3TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6CQELU3RyaW5nRW50cnkCCQERa2V5UmVzUHJvcG9ydGlvbnMACQC5CQIIBQFyAl82AgFfCQELU3RyaW5nRW50cnkCCQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAEFCWNvbnRpbmVudAkAuQkCCAUBcgNfMTACAV8JAQtTdHJpbmdFbnRyeQIJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkAuQkCCQDMCAIFCWNvbnRpbmVudAkAzAgCAgFMCQDMCAIFDm5ld0xhbmRBc3NldElkBQNuaWwCAV8JAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIAAQUHYXNzZXRJZAUObmV3TGFuZEFzc2V0SWQBA3MybQIEYWRkcgxsYW5kQXNzZXRJZHMJAQ1tZXJnZUludGVybmFsBgIBTQADAgRTU1NTBQRhZGRyBQxsYW5kQXNzZXRJZHMAAAEDbTJsAgRhZGRyDGxhbmRBc3NldElkcwkBDW1lcmdlSW50ZXJuYWwGAgFMAAQCA1NNTQUEYWRkcgUMbGFuZEFzc2V0SWRzCQBoAgURSW5mcmFVcGdyYWRlQ29zdFMABAEEbDJ4bAIEYWRkcgxsYW5kQXNzZXRJZHMJAQ1tZXJnZUludGVybmFsBgICWEwABQIFU1NTTUwFBGFkZHIFDGxhbmRBc3NldElkcwkAaAIFEUluZnJhVXBncmFkZUNvc3RTAC8BBnhsMnh4bAIEYWRkcgxsYW5kQXNzZXRJZHMJAQ1tZXJnZUludGVybmFsBgIDWFhMAAYCA0xYTAUEYWRkcgUMbGFuZEFzc2V0SWRzCQBoAgURSW5mcmFVcGdyYWRlQ29zdFMANgELbWVyZ2VDb21tb24CBGFkZHIMbGFuZEFzc2V0SWRzBAckbWF0Y2gwCQCQAwEFDGxhbmRBc3NldElkcwMJAAACAAQFByRtYXRjaDAJAQNzMm0CBQRhZGRyBQxsYW5kQXNzZXRJZHMDCQAAAgADBQckbWF0Y2gwCQEDbTJsAgUEYWRkcgUMbGFuZEFzc2V0SWRzAwkAAAIABQUHJG1hdGNoMAkBBGwyeGwCBQRhZGRyBQxsYW5kQXNzZXRJZHMDCQAAAgACBQckbWF0Y2gwCQEGeGwyeHhsAgUEYWRkcgUMbGFuZEFzc2V0SWRzCQACAQINVW5rbm93biBtZXJnZQEVY2hlY2tPdXRkYXRlZERlbGl2ZXJ5AQh1c2VyQWRkcgQEZHVjawkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQh1c2VyQWRkcgMDBRFLU19BTExPV19ERUxJVkVSWQkBCWlzRGVmaW5lZAEFBGR1Y2sHBAtkdWNrQXNzZXRJZAkBBXZhbHVlAQUEZHVjawQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEA2xvYwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFBmxvY0tleQUPREVGQVVMVExPQ0FUSU9OAgFfBAlzdGFydFRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsb2MFD2xvY0lkeENvbnRpbmVudAMDCQECIT0CCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBRAYJAGYCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZAIFCXN0YXJ0VGltZQUSVEVOX01JTlVURVNfTUlMTElTBQNuaWwECWhlYWx0aEtleQkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAMJAGcCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQhsb2NJZHhJZAADBAZyZXdhcmQJAPwHBAUPZWNvbm9teUNvbnRyYWN0AhJzZW5kRGVsaXZlcnlSZXdhcmQJAMwIAgUIdXNlckFkZHIFA25pbAUDbmlsAwkAAAIFBnJld2FyZAUGcmV3YXJkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM0IAgkAzQgCBAtsb2NrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9lY29ub215Q29udHJhY3QFEWRlbGl2ZXJ5TG9ja2VkS2V5AAAEBnVubG9jawkA/AcEBQ9lY29ub215Q29udHJhY3QCFHVwZGF0ZURlbGl2ZXJ5TG9ja2VkCQDMCAIJAGUCBQtsb2NrZWRUb3RhbAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawMJAGcCAAAJARFAZXh0ck5hdGl2ZSgxMDU1KQEFCWhlYWx0aEtleQUDbmlsBApwdW5pc2htZW50CQD8BwQFBHRoaXMCC3NhdmVJbnRlZ2VyCQDMCAIJARZrZXlEZWxpdmVyeURlbGF5QnlEdWNrAQULZHVja0Fzc2V0SWQJAMwIAgkAZAIFCXN0YXJ0VGltZQUTREVMSVZFUllfUFVOSVNITUVOVAUDbmlsBQNuaWwDCQAAAgUKcHVuaXNobWVudAUKcHVuaXNobWVudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEMSW50ZWdlckVudHJ5AgUJaGVhbHRoS2V5CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEOa2V5U2F2ZWRIZWFsdGgBBQtkdWNrQXNzZXRJZAkBC1N0cmluZ0VudHJ5AgUGbG9jS2V5CQERQGV4dHJOYXRpdmUoMTA1OCkBCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQNuaWwBBnByb2xvZwEBaQMDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDHJlc3RDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UECHVzZXJBZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgkAzQgCCQEVY2hlY2tPdXRkYXRlZERlbGl2ZXJ5AQUIdXNlckFkZHIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYXN0VHhJZEJ5VXNlcgEFCHVzZXJBZGRyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQBDHByb2xvZ0ZsaWdodAEBaQMDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDHJlc3RDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RUeElkQnlVc2VyAQkApQgBCAUBaQxvcmlnaW5DYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsLQFpAQ1jb25zdHJ1Y3RvclYxAQhyZXN0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQELc2F2ZUludGVnZXICA2tleQZhbW91bnQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAiBzYXZlSW50ZWdlciBpcyBub3QgcHVibGljIG1ldGhvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQZhbW91bnQFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQlzdGFrZUxhbmQABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgEJAKwCAgkArAICAgRORlQgBQpMQU5EUFJFRklYAiQgdG9rZW4gc2hvdWxkIGJlIGF0dGFjaGVkIGFzIHBheW1lbnQEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQDCQECIT0CCAUFYXNzZXQGaXNzdWVyBQR0aGlzCQACAQIXVW5rbm93biBpc3N1ZXIgb2YgdG9rZW4DCQEBIQEJAQhjb250YWlucwIIBQVhc3NldARuYW1lBQpMQU5EUFJFRklYCQACAQkArAICCQCsAgICCU9ubHkgTkZUIAUKTEFORFBSRUZJWAIUIHRva2VucyBhcmUgYWNjZXB0ZWQEC2xhbmROdW1TaXplCQCwAgIIBQVhc3NldARuYW1lAAQEB2xhbmROdW0DCQEIY29udGFpbnMCBQtsYW5kTnVtU2l6ZQIDWFhMCQCzAgIFC2xhbmROdW1TaXplAAMDCQEIY29udGFpbnMCBQtsYW5kTnVtU2l6ZQICWEwJALMCAgULbGFuZE51bVNpemUAAgkAswICBQtsYW5kTnVtU2l6ZQABAwkBASEBCQEJaXNEZWZpbmVkAQkAtgkBBQdsYW5kTnVtCQACAQkArAICAh5DYW5ub3QgcGFyc2UgbGFuZCBudW1iZXIgZnJvbSAIBQVhc3NldARuYW1lBAtsYW5kQXNzZXRJZAkA2AQBBQdhc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAwkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQISIGlzIGFscmVhZHkgc3Rha2VkBAFkCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIFAWQFC3JlY1RlcnJhaW5zBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIFAWQFC3JlY0xhbmRTaXplBAlsYW5kSW5kZXgJAGkCBQZwaWVjZXMFBVNTSVpFBAVwcm9wcwkBEXVwZGF0ZVByb3BvcnRpb25zAwUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AAEEDHJlc0J5Q29udEtleQkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBCQCRAwIFAWQFDHJlY0NvbnRpbmVudAQJY29udFByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUMcmVzQnlDb250S2V5AgswXzBfMF8wXzBfMAIBXwQQdXBkYXRlZENvbnRQcm9wcwkAuQkCCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQFCWNvbnRQcm9wcwUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AAECAV8ECGxhbmRzS2V5CQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQIbGFuZHNTdHIJAKIIAQUIbGFuZHNLZXkEBWxhbmRzAwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUFbGFuZHMFC2xhbmRBc3NldElkCQACAQkArAICAiJZb3VyIHN0YWtlZCBsYW5kcyBhbHJlYWR5IGNvbnRhaW4gBQtsYW5kQXNzZXRJZAMJAGcCCQCQAwEFBWxhbmRzBRhNQVhfTEFORFNfU1RBS0VEX0JZX1VTRVIJAAIBCQCsAgIJAKwCAgIZWW91ciBhbHJlYWR5IHN0YWtlZCBtYXggKAkApAMBBRhNQVhfTEFORFNfU1RBS0VEX0JZX1VTRVICBykgbGFuZHMECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAlwaWVjZXNLZXkJARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQUHYWRkcmVzcwQJb2xkUGllY2VzCQELdmFsdWVPckVsc2UCCQCfCAEFCXBpZWNlc0tleQAABAl3bGdSZXN1bHQJAPwHBAULd2xnQ29udHJhY3QCEm9uU3Rha2VVbnN0YWtlTGFuZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgFC2xhbmRBc3NldElkBQdhZGRyZXNzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCBQhsYW5kc0tleQkAuwkCCQDNCAIFBWxhbmRzBQtsYW5kQXNzZXRJZAIBXwkAzAgCCQEMSW50ZWdlckVudHJ5AgUJcGllY2VzS2V5CQBkAgUJb2xkUGllY2VzBQZwaWVjZXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkBQdhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYW5kTnVtVG9Pd25lcgEFB2xhbmROdW0FB2FkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAR5rZXlJbmZyYUxldmVsQnlBc3NldElkQW5kT3duZXICBQtsYW5kQXNzZXRJZAUHYWRkcmVzcwUKaW5mcmFMZXZlbAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5UmVzUHJvcG9ydGlvbnMABQVwcm9wcwkAzAgCCQELU3RyaW5nRW50cnkCBQxyZXNCeUNvbnRLZXkFEHVwZGF0ZWRDb250UHJvcHMFA25pbAUNcHJvbG9nQWN0aW9ucwUJd2xnUmVzdWx0AWkBC3Vuc3Rha2VMYW5kAQ1sYW5kQXNzZXRJZEluBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQBYwkBFGNoZWNrQ2xhaW1Db25kaXRpb25zAwUEYWRkcgUNY2xhaW1Nb2RlRHVjawUNbGFuZEFzc2V0SWRJbgQLbGFuZEFzc2V0SWQIBQFjAl8yBAFkCAUBYwJfMwQIbGFuZHNLZXkJARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBBQRhZGRyBA10ZXJyYWluQ291bnRzCQENY291bnRUZXJyYWlucwEJAJEDAgUBZAULcmVjVGVycmFpbnMEBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgUBZAULcmVjTGFuZFNpemUECWxhbmRJbmRleAkAaQIFBnBpZWNlcwUFU1NJWkUEBXByb3BzCQERdXBkYXRlUHJvcG9ydGlvbnMDBQ10ZXJyYWluQ291bnRzBQlsYW5kSW5kZXgA////////////AQQMcmVzQnlDb250S2V5CQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAEJAJEDAgUBZAUMcmVjQ29udGluZW50BAljb250UHJvcHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQxyZXNCeUNvbnRLZXkCCzBfMF8wXzBfMF8wAgFfBBB1cGRhdGVkQ29udFByb3BzCQC5CQIJARl1cGRhdGVQcm9wb3J0aW9uc0ludGVybmFsBAUJY29udFByb3BzBQ10ZXJyYWluQ291bnRzBQlsYW5kSW5kZXgA////////////AQIBXwQLY2xhaW1SZXN1bHQJAQhjbGFpbUFsbAQFBGFkZHIFC2xhbmRBc3NldElkBQZwaWVjZXMFDWNsYWltTW9kZUR1Y2sEBWxhbmRzCQC9CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUIbGFuZHNLZXkCAAIBXwQDaWR4CQDPCAIFBWxhbmRzBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEFA2lkeAkAAgEJAKwCAgIgWW91ciBzdGFrZWQgbGFuZHMgZG9uJ3QgY29udGFpbiAFC2xhbmRBc3NldElkBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBA5nb3ZSZWxlYXNlVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQtnb3ZDb250cmFjdAkBFWtleVVzZXJHd2xSZWxlYXNlVGltZQEFBGFkZHIAAAMJAGcCBQ5nb3ZSZWxlYXNlVGltZQUDbm93CQACAQkArAICAjlZb3VyIGdXTCBhcmUgdGFraW5nIHBhcnQgaW4gdm90aW5nLCBjYW5ub3QgdW5zdGFrZSB1bnRpbCAJAKQDAQUOZ292UmVsZWFzZVRpbWUEDmFyYlJlbGVhc2VUaW1lCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQt3bGdDb250cmFjdAkBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQUEYWRkcgAABQ5hcmJpdHJhZ2VEZWxheQMJAGYCBQ5hcmJSZWxlYXNlVGltZQUDbm93CQACAQkArAICAj9Zb3VyIHN0YWtlZCBsYW5kcyB0b29rIHBhcnQgaW4gYXJiaXRyYWdlLCBjYW5ub3QgdW5zdGFrZSB1bnRpbCAJAKQDAQUOYXJiUmVsZWFzZVRpbWUECXBpZWNlc0tleQkBFmtleVN0YWtlZFBpZWNlc0J5T3duZXIBBQRhZGRyBAxzdGFrZWRQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJcGllY2VzS2V5AAAECW5ld1BpZWNlcwMJAGYCBQZwaWVjZXMFDHN0YWtlZFBpZWNlcwAACQBlAgUMc3Rha2VkUGllY2VzBQZwaWVjZXMECXdsZ1Jlc3VsdAkA/AcEBQt3bGdDb250cmFjdAISb25TdGFrZVVuc3Rha2VMYW5kCQDMCAIFBGFkZHIFA25pbAUDbmlsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkA2QQBBQtsYW5kQXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKTEFORFBSRUZJWAULbGFuZEFzc2V0SWQFBGFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleVJlc1Byb3BvcnRpb25zAAUFcHJvcHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUMcmVzQnlDb250S2V5BRB1cGRhdGVkQ29udFByb3BzCQDMCAIJAQtTdHJpbmdFbnRyeQIIBQtjbGFpbVJlc3VsdAJfMgkAuQkCCAULY2xhaW1SZXN1bHQCXzMCAToJAMwIAgMJAGYCCQCQAwEFBWxhbmRzAAEJAQtTdHJpbmdFbnRyeQIFCGxhbmRzS2V5CQC7CQIJANEIAgUFbGFuZHMJAQV2YWx1ZQEFA2lkeAIBXwkBC0RlbGV0ZUVudHJ5AQUIbGFuZHNLZXkJAMwIAgkBDEludGVnZXJFbnRyeQIFCXBpZWNlc0tleQUJbmV3UGllY2VzBQNuaWwFDXByb2xvZ0FjdGlvbnMFCXdsZ1Jlc3VsdAFpAQlzdGFrZUR1Y2sABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgEJAKwCAgkArAICAgRORlQgBQpEVUNLUFJFRklYAiQgdG9rZW4gc2hvdWxkIGJlIGF0dGFjaGVkIGFzIHBheW1lbnQEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQDAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUNaW5jdWJhdG9yQWRkcgkBAiE9AggFBWFzc2V0Bmlzc3VlcgULYnJlZWRlckFkZHIHCQACAQkArAICCQCsAgICElVua25vd24gaXNzdWVyIG9mIAUKRFVDS1BSRUZJWAIGIHRva2VuAwkBASEBCQEIY29udGFpbnMCCAUFYXNzZXQEbmFtZQUKRFVDS1BSRUZJWAkAAgEJAKwCAgkArAICAglPbmx5IE5GVCAFCkRVQ0tQUkVGSVgCFCB0b2tlbnMgYXJlIGFjY2VwdGVkBAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUKYXNzZXRJZFN0cgMJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCEiBpcyBhbHJlYWR5IHN0YWtlZAMJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MJAAIBCQCsAgICHVlvdSBhbHJlYWR5IHN0YWtlZCBvbmUgZHVjazogCAUFYXNzZXQEbmFtZQQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQUKYXNzZXRJZFN0cgQIbG9jYXRpb24JAKIIAQUGbG9jS2V5BAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQUKYXNzZXRJZFN0cgQIYmFja3BhY2sJAKIIAQUFYnBLZXkECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQphc3NldElkU3RyBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFCmFzc2V0SWRTdHIAAAQJY3VySGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKRFVDS1BSRUZJWAkA2AQBBQdhc3NldElkBQdhZGRyZXNzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5RHVja0lkVG9Pd25lcgEFCmFzc2V0SWRTdHIFB2FkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwUKYXNzZXRJZFN0cgUDbmlsAwkBCWlzRGVmaW5lZAEFCGxvY2F0aW9uBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQZsb2NLZXkFD0RFRkFVTFRMT0NBVElPTgUDbmlsAwkBCWlzRGVmaW5lZAEFCGJhY2twYWNrBQNuaWwJAM4IAgkAzQgCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5AhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgUDbmlsCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoBQljdXJIZWFsdGgFDXByb2xvZ0FjdGlvbnMBaQELdW5zdGFrZUR1Y2sBCmFzc2V0SWRTdHIEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUKYXNzZXRJZFN0cgMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MJAAIBCQCsAgIJAKwCAgIJVGhlIGR1Y2sgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBEGtleUR1Y2tJZFRvT3duZXIBBQphc3NldElkU3RyCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQdhZGRyZXNzCQACAQIXU3Rha2VkIE5GVCBpcyBub3QgeW91cnMDCQEPY2hlY2tUb3VybmFtZW50AQUKYXNzZXRJZFN0cgkAAgECG3Vuc3Rha2VEdWNrX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQUKYXNzZXRJZFN0cgkAAgECGXVuc3Rha2VEdWNrX2NoZWNrRGVsaXZlcnkECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQphc3NldElkU3RyBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFCmFzc2V0SWRTdHIAAAQGaGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFADCQBmAgUFbWF4SFAFBmhlYWx0aAkAAgEJAKwCAgkArAICAhlQbGVhc2UgaGVhbCB5b3VyIGR1Y2sgdG8gCQCkAwEFBW1heEhQAhNocCBiZWZvcmUgdW5zdGFraW5nCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEFB2Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUHdGltZUtleQkAzAgCCQELRGVsZXRlRW50cnkBBQlrZXlIZWFsdGgJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBD2tleUR1Y2tMb2NhdGlvbgEFCmFzc2V0SWRTdHIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEGtleUR1Y2tJZFRvT3duZXIBBQphc3NldElkU3RyCQDMCAIJAQtEZWxldGVFbnRyeQEJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKRFVDS1BSRUZJWAUKYXNzZXRJZFN0cgUHYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQdhZGRyZXNzBQNuaWwFDXByb2xvZ0FjdGlvbnMBaQEIY2xhaW1SZXMCBmFtb3VudA5sYW5kQXNzZXRJZFN0cgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBnJlc3VsdAkBEGNsYWltUmVzSW50ZXJuYWwEBQRhZGRyBQZhbW91bnQFDWNsYWltTW9kZUR1Y2sFDmxhbmRBc3NldElkU3RyBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQJAJQKAgkAzggCCQDNCAIJAM0IAgkAzggCCAUGcmVzdWx0Al8xCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQJAGsDBQd4cENsYWltBQZhbW91bnQFBU1VTFQ4Al8xCQELU3RyaW5nRW50cnkCCAUGcmVzdWx0Al8yCQC5CQIIBQZyZXN1bHQCXzMCAToJAQtTdHJpbmdFbnRyeQIIBQZyZXN1bHQCXzQJALkJAggFBnJlc3VsdAJfNQIBOgUNcHJvbG9nQWN0aW9ucwkAkQMCCAUGcmVzdWx0Al8zBQhicElkeFJlcwFpAQxjbGFpbVJlc1RvV0gCBmFtb3VudA5sYW5kQXNzZXRJZFN0cgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBnJlc3VsdAkBEGNsYWltUmVzSW50ZXJuYWwEBQRhZGRyBQZhbW91bnQFC2NsYWltTW9kZVdoBQ5sYW5kQXNzZXRJZFN0cgkAlAoCCQDOCAIJAM0IAgkAzQgCCQDOCAIIBQZyZXN1bHQCXzEICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIFBGFkZHIJAGsDBQd4cENsYWltBQZhbW91bnQFBU1VTFQ4Al8xCQELU3RyaW5nRW50cnkCCAUGcmVzdWx0Al8yCQC5CQIIBQZyZXN1bHQCXzMCAToJAQtTdHJpbmdFbnRyeQIIBQZyZXN1bHQCXzQJALkJAggFBnJlc3VsdAJfNQIBOgUNcHJvbG9nQWN0aW9ucwkAkQMCCAUGcmVzdWx0Al81BQh3aElkeFJlcwFpAQZmbGlnaHQCB21lc3NhZ2UDc2lnBA1wcm9sb2dBY3Rpb25zCQEMcHJvbG9nRmxpZ2h0AQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAh1c2VyQWRkcgkApQgBCAUBaQZjYWxsZXIEAWYJAQxmbGlnaHRDb21tb24DBQh1c2VyQWRkcgUHbWVzc2FnZQUDc2lnBAVuZXdIUAgFAWYCXzEEC2R1Y2tBc3NldElkCAUBZgJfMgQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEFBmxvY0tleQUPREVGQVVMVExPQ0FUSU9OBAtuZXdMb2NhdGlvbggFAWYCXzQDCQAAAgULbmV3TG9jYXRpb24FC2N1ckxvY2F0aW9uCQACAQIiWW91IGNhbid0IGZseSB0byB0aGUgc2FtZSBsb2NhdGlvbgQGbmV3TG9jCQC1CQIFC25ld0xvY2F0aW9uAgFfBAZpc1RvdXIJAAACCQCRAwIFBm5ld0xvYwUKbG9jSWR4VHlwZQIBVAQHaXNEZWxpdgkAAAIJAJEDAgUGbmV3TG9jBQpsb2NJZHhUeXBlAgFEBAVlcUtleQkBEGtleUR1Y2tFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAQJY3VycmVudEVxCQELdmFsdWVPckVsc2UCCQCiCAEFBWVxS2V5AhcsOyxfLDssXyw7LF8sOyxfLDssXyw7LAQNJHQwNzAzNzQ3MDQ3MQkBEXN1YnRyYWN0RXF1aXBtZW50AgUJY3VycmVudEVxCAUBZgJfNQQFbmV3RXEIBQ0kdDA3MDM3NDcwNDcxAl8xBA9zaG91bGRaZXJvQnVmZnMIBQ0kdDA3MDM3NDcwNDcxAl8yBA0kdDA3MDQ3NDczNTkyAwkBASEBCQEJb25NaXNzaW9uAgUSdG91cm5hbWVudENvbnRyYWN0BQtjdXJMb2NhdGlvbgMJAQEhAQkBD2lzVXN1YWxMb2NhdGlvbgEFC25ld0xvY2F0aW9uCQEMY2hlYXRBdHRlbXB0AwULY3VyTG9jYXRpb24FC25ld0xvY2F0aW9uAAUDCQBmAgUFbmV3SFAAAAkAlAoCBQtuZXdMb2NhdGlvbgUFbmV3SFAJAJQKAgULY3VyTG9jYXRpb24AAAMJAQ5pc0luVG91cm5hbWVudAIFEnRvdXJuYW1lbnRDb250cmFjdAULY3VyTG9jYXRpb24DCQEBIQEJAQ5pc0luVG91cm5hbWVudAIFEnRvdXJuYW1lbnRDb250cmFjdAULbmV3TG9jYXRpb24JAAIBAipZb3VyIGR1Y2sgaXMgdGFraW5nIHBhcnQgaW4gdGhlIHRvdXJuYW1lbnQEBXNjb3JlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGbmV3TG9jBQhsb2NJZHhJZAQGY3VyTG9jCQC1CQIFC2N1ckxvY2F0aW9uAgFfBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAADCQECIT0CBQVzY29yZQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZjdXJMb2MFCGxvY0lkeElkAAEJAQxjaGVhdEF0dGVtcHQDBQtjdXJMb2NhdGlvbgULbmV3TG9jYXRpb24ABwMJAGYCBQVuZXdIUAAABAlsb2NhbEJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0CQEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkAAAECHVwZExvY2FsAwkAZgIFBXNjb3JlBQlsb2NhbEJlc3QJAPwHBAUSdG91cm5hbWVudENvbnRyYWN0Ag5zYXZlRHVja1Jlc3VsdAkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQVzY29yZQUDbmlsBQNuaWwFBHVuaXQDCQAAAgUIdXBkTG9jYWwFCHVwZExvY2FsCQCUCgIFC25ld0xvY2F0aW9uBQVuZXdIUAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQtjdXJMb2NhdGlvbgAAAwkBASEBCQEMaXNJbkRlbGl2ZXJ5AQULY3VyTG9jYXRpb24ECWxvY0hlYWx0aAkBEGFzU3RyaW5nSW50VHVwbGUBCQD8BwQFBHRoaXMCEGF1dG9FeGl0RGVsaXZlcnkJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUFbmV3SFAJAMwIAgMFB2lzRGVsaXYCAjEwAgIxMQkAzAgCAAAFA25pbAUDbmlsAwkAAAIFCWxvY0hlYWx0aAUJbG9jSGVhbHRoAwUHaXNEZWxpdgUJbG9jSGVhbHRoAwkAZgIFBW5ld0hQAAAJAJQKAgULbmV3TG9jYXRpb24FBW5ld0hQCQCUCgIIBQlsb2NIZWFsdGgCXzEAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAQEhAQUHaXNEZWxpdgkAAgECJFlvdXIgZHVjayBpcyB0YWtpbmcgcGFydCBpbiBkZWxpdmVyeQMJAQEhAQkBDGlzSW5EZWxpdmVyeQEFC25ld0xvY2F0aW9uCQEMY2hlYXRBdHRlbXB0AwULY3VyTG9jYXRpb24FC25ld0xvY2F0aW9uAA0EBXNjb3JlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGbmV3TG9jBQhsb2NJZHhJZAQGY3VyTG9jCQC1CQIFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgUFc2NvcmUJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGY3VyTG9jBQhsb2NJZHhJZAABCQEMY2hlYXRBdHRlbXB0AwULY3VyTG9jYXRpb24FC25ld0xvY2F0aW9uAA4DAwkAZgIFBW5ld0hQAAAJAGYCAAMFBXNjb3JlBwkAlAoCBQtuZXdMb2NhdGlvbgUFbmV3SFAECWxvY0hlYWx0aAkBEGFzU3RyaW5nSW50VHVwbGUBCQD8BwQFBHRoaXMCEGF1dG9FeGl0RGVsaXZlcnkJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUFbmV3SFAJAMwIAgIFMTUtMTcJAMwIAgUFc2NvcmUFA25pbAUDbmlsAwkAAAIFCWxvY0hlYWx0aAUJbG9jSGVhbHRoBQlsb2NIZWFsdGgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECWxvY1RvU2F2ZQgFDSR0MDcwNDc0NzM1OTICXzEECGhwVG9TYXZlCAUNJHQwNzA0NzQ3MzU5MgJfMgkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmxvY0tleQUJbG9jVG9TYXZlCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWVxS2V5BQVuZXdFcQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAUIaHBUb1NhdmUFA25pbAUNcHJvbG9nQWN0aW9ucwMFD3Nob3VsZFplcm9CdWZmcwkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RHVja0J1ZmZzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAUDbmlsBQNuaWwICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAMJAGYCBQVuZXdIUAAABQ94cFN1Y2Nlc3NGbGlnaHQFDHhwRmFpbEZsaWdodAJfMQgFAWYCXzMBaQEEaGVhbAMKcXVhbnRpdHlMMQpxdWFudGl0eUwyCnF1YW50aXR5TDMEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwMDCQBmAgAABQpxdWFudGl0eUwxBgkAZgIAAAUKcXVhbnRpdHlMMgYJAGYCAAAFCnF1YW50aXR5TDMJAAIBAhtRdWFudGl0eSBjYW5ub3QgYmUgbmVnYXRpdmUEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAhRoZWFsX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhJoZWFsX2NoZWNrRGVsaXZlcnkEA3F0cwkAzAgCBQpxdWFudGl0eUwxCQDMCAIFCnF1YW50aXR5TDIJAMwIAgUKcXVhbnRpdHlMMwUDbmlsBAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQEBW1heEhQCQEJbWF4SGVhbHRoAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAQJb2xkSGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFADCQBnAgUJb2xkSGVhbHRoBQVtYXhIUAkAAgEJAKwCAgkArAICAg9IUCBzaG91bGQgYmUgPCAJAKQDAQUFbWF4SFACCCB0byBoZWFsBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQIcHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8KAQtpdGVyYXRlUHJvZAIDYWNjBnJlY2lwZQQBbggFA2FjYwJfMgQBeAMJAGYCCQCQAwEFCHByb2RMaXN0BQFuCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvZExpc3QFAW4AAAMJAGYCAAMFAW4EAXEJAJEDAgUDcXRzBQFuAwkAZgIFAXEFAXgJAAIBCQCsAgIJAKwCAgkArAICAg5Zb3UgaGF2ZSBvbmx5IAkApAMBBQF4AgQgb2YgCQCRAwIFCXByb2RUeXBlcwUBbgkAlQoDCQDNCAIIBQNhY2MCXzEJAKQDAQkAZQIFAXgFAXEJAGQCBQFuAAEJAGQCCAUDYWNjAl8zCQBoAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgUGcmVjaXBlAgFfBQpySWR4RWZmZWN0BQFxCQCVCgMJAM0IAggFA2FjYwJfMQkApAMBBQF4CQBkAgUBbgABCAUDYWNjAl8zBAZyZXN1bHQKAAIkbAUQcHJvZHVjdGlvbk1hdHJpeAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELaXRlcmF0ZVByb2QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgQJbmV3SGVhbHRoCQCXAwEJAMwIAgUFbWF4SFAJAMwIAgkAZAIFCW9sZEhlYWx0aAgFBnJlc3VsdAJfMwUDbmlsCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgFCW5ld0hlYWx0aAkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAuQkCCAUGcmVzdWx0Al8xAgFfBQNuaWwCAToFA25pbAUNcHJvbG9nQWN0aW9ucwgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFC2R1Y2tBc3NldElkCQBoAgUGeHBIZWFsCQBkAgkAZAIFCnF1YW50aXR5TDEFCnF1YW50aXR5TDIFCnF1YW50aXR5TDMCXzEFCW5ld0hlYWx0aAFpAQZoZWFsRVMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECGkFsbG93ZWQgVVNEVCBwYXltZW50IG9ubHkhBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBD2NoZWNrVG91cm5hbWVudAEFC2R1Y2tBc3NldElkCQACAQIWaGVhbEVTX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhRoZWFsRVNfY2hlY2tEZWxpdmVyeQQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAECW9sZEhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgFBW1heEhQAwkAZgIFCW9sZEhlYWx0aAAACQACAQIoSFAgc2hvdWxkIGJlIDAgdG8gY2FsbCBFbWVyZ2VuY3kgU2VydmljZQQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBA1tZWRLaXRBbW91bnQxAwkAZgIJAJADAQUIcHJvZExpc3QAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCHByb2RMaXN0AAAAAAQNbWVkS2l0QW1vdW50MgMJAGYCCQCQAwEFCHByb2RMaXN0AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhwcm9kTGlzdAABAAAEDW1lZEtpdEFtb3VudDMDCQBmAgkAkAMBBQhwcm9kTGlzdAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvZExpc3QAAgAAAwMDCQBmAgUNbWVkS2l0QW1vdW50MQAABgkAZgIFDW1lZEtpdEFtb3VudDIAAAYJAGYCBQ1tZWRLaXRBbW91bnQzAAAJAAIBAh9Zb3UgaGF2ZSB0byB1c2Ugb3duIE1lZGljYWwgS2l0BAhleGlzdFN0cgkAnQgCBQ9lY29ub215Q29udHJhY3QJAQ5rZXlFc1dhcmVob3VzZQAEDGV4aXN0QW1vdW50cwMJAQlpc0RlZmluZWQBBQhleGlzdFN0cgkAvAkCCQEFdmFsdWUBBQhleGlzdFN0cgIBXwUDbmlsBAtleGlzdEFtb3VudAMJAGYCCQCQAwEFDGV4aXN0QW1vdW50cwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMZXhpc3RBbW91bnRzAAAAAAMJAGcCAAAFC2V4aXN0QW1vdW50CQACAQI5VGhlcmUgYXJlIG5vIE1lZGljYWwgS2l0cyBMMSBhdCBFbWVyZ2VuY3kgU2VydmljZSBzdG9yYWdlBAluZXdIZWFsdGgJAGQCBQlvbGRIZWFsdGgJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAAAAgFfBQpySWR4RWZmZWN0BAVuZXdFUwkAuQkCCQDMCAIJAKQDAQkAZQIFC2V4aXN0QW1vdW50AAEJANEIAgUMZXhpc3RBbW91bnRzAAACAV8EBnJlY2lwZQkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgAAAIBXwQIdG90YWxNYXQJARJnZXRSZWNpcGVNYXRlcmlhbHMBBQZyZWNpcGUECXNlbGxQcmljZQkAawMJAGgCBQh0b3RhbE1hdAUKRVNTRUxMQ09FRgUQUkVTT1VSQ0VQUklDRU1JTgkAaAIFBU1VTFQ4BQ5QUk9EVUNUUEtHU0laRQMJAQIhPQIIBQNwbXQGYW1vdW50BQlzZWxsUHJpY2UJAAIBCQCsAgICG1BheW1lbnQgYXR0YWNoZWQgc2hvdWxkIGJlIAkApAMBBQlzZWxsUHJpY2UEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9lY29ub215Q29udHJhY3QCD3VwZGF0ZUVzU3RvcmFnZQkAzAgCBQVuZXdFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt1c2R0QXNzZXRJZAUJc2VsbFByaWNlBQNuaWwJAJQKAgkAzggCCQDNCAIFDXByb2xvZ0FjdGlvbnMJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgFCW5ld0hlYWx0aAgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFC2R1Y2tBc3NldElkBQh4cENhbGxFUwJfMQUGcmVzdWx0AWkBDnVwZGF0ZUJhY2twYWNrAgtkdWNrQXNzZXRJZAduZXdQYWNrAwkBAiE9AggFAWkGY2FsbGVyBQ9lY29ub215Q29udHJhY3QJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBQduZXdQYWNrBQNuaWwFB25ld1BhY2sBaQEPY29tbWl0Rm9yUmFuZG9tAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkEC2ZpbmlzaEJsb2NrCQBkAgUGaGVpZ2h0BQtyYW5kb21EZWxheQQEYWRkcgkApQgBCAUBaQZjYWxsZXIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5Q29tbWl0AQUEYWRkcgULZmluaXNoQmxvY2sFA25pbAUNcHJvbG9nQWN0aW9ucwULZmluaXNoQmxvY2sBaQEIYnV5U0xhbmQABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECGkFsbG93ZWQgVVNEVCBwYXltZW50IG9ubHkhAwkBAiE9AggFA3BtdAZhbW91bnQFB0VYUFVTRFQJAAIBCQCsAgICG1BheW1lbnQgYXR0YWNoZWQgc2hvdWxkIGJlIAkApAMBBQdFWFBVU0RUBAZyZXN1bHQJARJleHBlZGl0aW9uSW50ZXJuYWwCCAUBaQZjYWxsZXIIBQFpDXRyYW5zYWN0aW9uSWQEC2FjcmVzUmVzdWx0CQEFYXNJbnQBCQD8BwQFDWFjcmVzQ29udHJhY3QCCWJ1cm5BY3JlcwkAzAgCBQxTX0NPU1RfQUNSRVMFA25pbAUDbmlsCQCUCgIJAM4IAgkAzggCCQDNCAIIBQZyZXN1bHQCXzEJAQ5TY3JpcHRUcmFuc2ZlcgMFD2Vjb25vbXlDb250cmFjdAgFA3BtdAZhbW91bnQFC3VzZHRBc3NldElkCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCCQClCAEIBQFpBmNhbGxlcgUKeHBOZXdTTGFuZAJfMQUNcHJvbG9nQWN0aW9ucwkAlAoCCAgFBnJlc3VsdAJfMgJfMQULYWNyZXNSZXN1bHQBaQEKZXhwZWRpdGlvbgIHbWVzc2FnZQNzaWcEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQECHVzZXJBZGRyCQClCAEIBQFpBmNhbGxlcgQBZgkBDGZsaWdodENvbW1vbgMFCHVzZXJBZGRyBQdtZXNzYWdlBQNzaWcEC2R1Y2tBc3NldElkCAUBZgJfMgQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQFbUxpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8EBm5ld01hdAkAuQkCCQERc3VidHJhY3RNYXRlcmlhbHMDBgUFbUxpc3QFDEVYUE1BVEVSSUFMUwIBXwQFZXFLZXkJARBrZXlEdWNrRXF1aXBtZW50AQULZHVja0Fzc2V0SWQECWN1cnJlbnRFcQkBC3ZhbHVlT3JFbHNlAgkAoggBBQVlcUtleQIXLDssXyw7LF8sOyxfLDssXyw7LF8sOywEDSR0MDgxMDMyODExMjkJARFzdWJ0cmFjdEVxdWlwbWVudAIFCWN1cnJlbnRFcQgFAWYCXzUEBW5ld0VxCAUNJHQwODEwMzI4MTEyOQJfMQQPc2hvdWxkWmVyb0J1ZmZzCAUNJHQwODEwMzI4MTEyOQJfMgQBZQkBEmV4cGVkaXRpb25JbnRlcm5hbAIIBQFpBmNhbGxlcggFAWkNdHJhbnNhY3Rpb25JZAQCaWQICAUBZQJfMgJfMQQGcmVzdWx0AwkAZwIAAAgFAWYCXzEJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgUFZXFLZXkFBW5ld0VxBQNuaWwCAAAACQCVCgMJAM4IAggFAWUCXzEDBQ9zaG91bGRaZXJvQnVmZnMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUR1Y2tCdWZmcwEFC2R1Y2tBc3NldElkAgkwXzBfMF8wXzAFA25pbAkAzQgCCQDNCAIJAM0IAgkAzQgCBQNuaWwJAQtTdHJpbmdFbnRyeQIJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkAuQkCCQDMCAIICAUBZQJfMgJfMgkAzAgCAgFMCQDMCAIFAmlkBQNuaWwCAV8JAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgIBQFmAl8xCQELU3RyaW5nRW50cnkCBQVlcUtleQUFbmV3RXEJAQtTdHJpbmdFbnRyeQIFBWJwS2V5CQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCBQZuZXdNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToFAmlkCAUBZgJfMwMJAQ9jaGVja1RvdXJuYW1lbnQBBQtkdWNrQXNzZXRJZAkAAgECGmV4cGVkaXRpb25fY2hlY2tUb3VybmFtZW50AwkBDWNoZWNrRGVsaXZlcnkBBQtkdWNrQXNzZXRJZAkAAgECGGV4cGVkaXRpb25fY2hlY2tEZWxpdmVyeQQLYWNyZXNSZXN1bHQJAQVhc0ludAEJAPwHBAUNYWNyZXNDb250cmFjdAIJYnVybkFjcmVzCQDMCAIFDFNfQ09TVF9BQ1JFUwUDbmlsBQNuaWwJAJQKAgkAzggCCQDOCAIIBQZyZXN1bHQCXzEICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAUKeHBOZXdTTGFuZAJfMQUNcHJvbG9nQWN0aW9ucwkAlQoDCAUGcmVzdWx0Al8yCAUGcmVzdWx0Al8zBQthY3Jlc1Jlc3VsdAFpARBidXlTTGFuZEZvckFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFDGFjcmVzQXNzZXRJZAkAAgECFEFDUkVTIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQxTX0NPU1RfQUNSRVMJAAIBCQCsAgICG1BheW1lbnQgYXR0YWNoZWQgc2hvdWxkIGJlIAkApAMBBQxTX0NPU1RfQUNSRVMEBnJlc3VsdAkBEmV4cGVkaXRpb25JbnRlcm5hbAIIBQFpBmNhbGxlcggFAWkNdHJhbnNhY3Rpb25JZAQLYWNyZXNSZXN1bHQJAQVhc0ludAEJAPwHBAUNYWNyZXNDb250cmFjdAIJYnVybkFjcmVzCQDMCAIFDFNfQ09TVF9BQ1JFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxhY3Jlc0Fzc2V0SWQFA2FtdAUDbmlsCQCUCgIJAM4IAgkAzggCCAUGcmVzdWx0Al8xCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCCQClCAEIBQFpBmNhbGxlcgUKeHBOZXdTTGFuZAJfMQUNcHJvbG9nQWN0aW9ucwkAlAoCCAgFBnJlc3VsdAJfMgJfMQULYWNyZXNSZXN1bHQBaQEMdXBncmFkZUluZnJhAQtsYW5kQXNzZXRJZAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQGcmVzdWx0CQENdXBJbmZyYUNvbW1vbgQGCAUBaQZjYWxsZXIAAAULbGFuZEFzc2V0SWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQJAJQKAgkAzggCCQDOCAIIBQZyZXN1bHQCXzEFDXByb2xvZ0FjdGlvbnMICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAkAawMFDnhwVXBncmFkZUluZnJhCAUGcmVzdWx0Al8zBQVNVUxUOAJfMQgFBnJlc3VsdAJfMgFpARBhY3RpdmF0ZUFydGlmYWN0AgdhcnROYW1lDmxhbmRBc3NldElkT3B0BA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQGcmVzdWx0BAckbWF0Y2gwBQdhcnROYW1lAwkAAAICB1BSRVNBTEUFByRtYXRjaDAJARJhY3RpdmF0ZVByZXNhbGVBcnQCBQRhZGRyBQ5sYW5kQXNzZXRJZE9wdAMJAAACAgdPTkJPQVJEBQckbWF0Y2gwCQESYWN0aXZhdGVPbmJvYXJkQXJ0AQUEYWRkcgkAAgECEFVua25vd24gYXJ0aWZhY3QJAM4IAgUGcmVzdWx0BQ1wcm9sb2dBY3Rpb25zAWkBCm1lcmdlTGFuZHMBDGxhbmRBc3NldElkcwQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQGcmVzdWx0CQELbWVyZ2VDb21tb24CCQClCAEIBQFpBmNhbGxlcgUMbGFuZEFzc2V0SWRzCQCUCgIJAM4IAgkAzggCCAUGcmVzdWx0Al8xBQ1wcm9sb2dBY3Rpb25zCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCCQClCAEIBQFpBmNhbGxlcgUHeHBNZXJnZQJfMQgFBnJlc3VsdAJfMgFpAQ1jYXJnb0V4Y2hhbmdlAgxjYXJnb0xpc3RTdHILbGFuZEFzc2V0SWQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQECmNhcmdvUGFydHMJALwJAgUMY2FyZ29MaXN0U3RyAgE6BARhZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAggFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQJbGFuZEluZGV4CQBpAgkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgkAtQkCCAUFYXNzZXQLZGVzY3JpcHRpb24CAV8FC3JlY0xhbmRTaXplBQVTU0laRQQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAAEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04EA2xvYwkAtQkCCQEFdmFsdWUBBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFMCQACAQkArAICCQCsAgICFkR1Y2sgbG9jYXRpb24gdHlwZSBpcyAJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAhEsIGJ1dCBzaG91bGQgYmUgTAMJAQIhPQIJAJEDAgUDbG9jBQhsb2NJZHhJZAULbGFuZEFzc2V0SWQJAAIBCQCsAgICG0R1Y2sgc2hvdWxkIGJlIG9uIHRoZSBsYW5kIAULbGFuZEFzc2V0SWQEBXdoS2V5CQESa2V5V2FyZWhvdXNlQnlMYW5kAQULbGFuZEFzc2V0SWQECWN1cnJlbnRXaAkBDGdldFdhcmVob3VzZQMFBXdoS2V5BQlsYW5kSW5kZXgFCmluZnJhTGV2ZWwEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAZyZXN1bHQJAQltb3ZlU3R1ZmYDBQpjYXJnb1BhcnRzBQljdXJyZW50V2gFC2N1cnJlbnRQYWNrBARsb2Z0CQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8EBWxvZnRPCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkCAUGcmVzdWx0Al83BAVsb2Z0RgkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQd2b2xGcmVlCAUGcmVzdWx0Al83CQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFYnBLZXkJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIIBQZyZXN1bHQCXzQJAMwIAggFBnJlc3VsdAJfNQkAzAgCCAUGcmVzdWx0Al82BQNuaWwCAToJAMwIAgkBC1N0cmluZ0VudHJ5AgUFd2hLZXkJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAggFBnJlc3VsdAJfMQkAzAgCCAUGcmVzdWx0Al8yCQDMCAIIBQZyZXN1bHQCXzMJAMwIAgkAuQkCCQDMCAIJAJEDAgUEbG9mdAUJdm9sTG9ja2VkCQDMCAIJAKQDAQUFbG9mdE8JAMwIAgkApAMBBQVsb2Z0RgkAzAgCCQCRAwIFBGxvZnQFCHZvbFRvdGFsBQNuaWwCAV8FA25pbAIBOgUDbmlsBQ1wcm9sb2dBY3Rpb25zAWkBDXNhdmVXYXJlaG91c2UCBXdoU3RyC2xhbmRBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQ9lY29ub215Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAV3aEtleQkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkBAJ3aAkAvAkCBQV3aFN0cgIBOgMJAQIhPQIJAJADAQUCd2gABQkAAgECMHdhcmVob3VzZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gNCAnOicgc2VwYXJhdG9ycwQFbG9mdEwJAJEDAgkAtQkCCQCRAwIFAndoBQl3aElkeExPRlQCAV8FCXZvbExvY2tlZAQFbG9mdE8JARdnZXRXYXJlaG91c2VPY2N1cGllZFZvbAEFAndoBAVsb2Z0VAkBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQkAkQMCBQJ3aAULd2hJZHhMZXZlbHMEBWxvZnRGCQBlAgkAZQIFBWxvZnRUCQENcGFyc2VJbnRWYWx1ZQEFBWxvZnRMBQVsb2Z0TwQIbmV3V2hTdHIJALoJAgkAzAgCCQCRAwIFAndoBQt3aElkeExldmVscwkAzAgCCQCRAwIFAndoBQh3aElkeFJlcwkAzAgCCQCRAwIFAndoBQh3aElkeE1hdAkAzAgCCQCRAwIFAndoBQl3aElkeFByb2QJAMwIAgkAuQkCCQDMCAIFBWxvZnRMCQDMCAIJAKQDAQUFbG9mdE8JAMwIAgkApAMBBQVsb2Z0RgkAzAgCCQCkAwEFBWxvZnRUBQNuaWwCAV8FA25pbAIBOgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBXdoS2V5BQhuZXdXaFN0cgUDbmlsBQhuZXdXaFN0cgFpARJmaXhXYXJlaG91c2VGb3JtYXQBC2xhbmRBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQxyZXN0Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAV3aEtleQkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAlsYW5kSW5kZXgJAGkCCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwULcmVjTGFuZFNpemUFBVNTSVpFBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAQCd2gJAQxnZXRXYXJlaG91c2UDBQV3aEtleQUJbGFuZEluZGV4BQppbmZyYUxldmVsBAVsb2Z0TAkBBWFzSW50AQkA/AcEBQ9lY29ub215Q29udHJhY3QCGnJlY2FsY0xvY2tlZFZvbHVtZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkCQDMCAIFAndoBQNuaWwFA25pbAQFbG9mdE8JARdnZXRXYXJlaG91c2VPY2N1cGllZFZvbAEFAndoBAVsb2Z0VAkBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQkAkQMCBQJ3aAULd2hJZHhMZXZlbHMEBWxvZnRGCQBlAgkAZQIFBWxvZnRUBQVsb2Z0TAUFbG9mdE8ECG5ld1doU3RyCQC6CQIJAMwIAgkAkQMCBQJ3aAULd2hJZHhMZXZlbHMJAMwIAgkAkQMCBQJ3aAUId2hJZHhSZXMJAMwIAgkAkQMCBQJ3aAUId2hJZHhNYXQJAMwIAgkAkQMCBQJ3aAUJd2hJZHhQcm9kCQDMCAIJALkJAgkAzAgCCQCkAwEFBWxvZnRMCQDMCAIJAKQDAQUFbG9mdE8JAMwIAgkApAMBBQVsb2Z0RgkAzAgCCQCkAwEFBWxvZnRUBQNuaWwCAV8FA25pbAIBOgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBXdoS2V5BQhuZXdXaFN0cgUDbmlsBQhuZXdXaFN0cgFpARdmaXhDb250aW5lbnRQcm9wb3J0aW9ucwEMbGFuZEFzc2V0SWRzAwkBAiE9AggFAWkGY2FsbGVyBQxyZXN0Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkCgEIZ2V0UHJvcHMCA2FjYwRjb250CQDNCAIFA2FjYwkBC3ZhbHVlT3JFbHNlAgkAoggBCQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAEFBGNvbnQCCzBfMF8wXzBfMF8wBAFwCgACJGwFCmNvbnRpbmVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGdldFByb3BzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQoBCXByb2Nlc3NvcgIDYWNjC2xhbmRBc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAFkCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwQJbGFuZEluZGV4CQBpAgkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgUBZAULcmVjTGFuZFNpemUFBVNTSVpFBARjb250CQCRAwIFAWQFDHJlY0NvbnRpbmVudAQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIFAWQFC3JlY1RlcnJhaW5zBAxjb250aW5lbnRJZHgJAQV2YWx1ZQEJAM8IAgUKY29udGluZW50cwUEY29udAQJY29udFByb3BzCQC1CQIJAJEDAgUDYWNjBQxjb250aW5lbnRJZHgCAV8EB3VwZGF0ZWQJALkJAgkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwEBQljb250UHJvcHMFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAABAgFfBAckbWF0Y2gwBQRjb250AwkAAAICCEFtZXJpY2FzBQckbWF0Y2gwCQDMCAIFB3VwZGF0ZWQJAMwIAgkAkQMCBQNhY2MAAQkAzAgCCQCRAwIFA2FjYwACCQDMCAIJAJEDAgUDYWNjAAMJAMwIAgkAkQMCBQNhY2MABAUDbmlsAwkAAAICBkV1cm9wZQUHJG1hdGNoMAkAzAgCCQCRAwIFA2FjYwAACQDMCAIFB3VwZGF0ZWQJAMwIAgkAkQMCBQNhY2MAAgkAzAgCCQCRAwIFA2FjYwADCQDMCAIJAJEDAgUDYWNjAAQFA25pbAMJAAACAgRBc2lhBQckbWF0Y2gwCQDMCAIJAJEDAgUDYWNjAAAJAMwIAgkAkQMCBQNhY2MAAQkAzAgCBQd1cGRhdGVkCQDMCAIJAJEDAgUDYWNjAAMJAMwIAgkAkQMCBQNhY2MABAUDbmlsAwkAAAICBkFmcmljYQUHJG1hdGNoMAkAzAgCCQCRAwIFA2FjYwAACQDMCAIJAJEDAgUDYWNjAAEJAMwIAgkAkQMCBQNhY2MAAgkAzAgCBQd1cGRhdGVkCQDMCAIJAJEDAgUDYWNjAAQFA25pbAMJAAACAgdPY2VhbmlhBQckbWF0Y2gwCQDMCAIJAJEDAgUDYWNjAAAJAMwIAgkAkQMCBQNhY2MAAQkAzAgCCQCRAwIFA2FjYwACCQDMCAIJAJEDAgUDYWNjAAMJAMwIAgUHdXBkYXRlZAUDbmlsCQACAQIPd3JvbmcgY29udGluZW50BAFyCgACJGwFDGxhbmRBc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFAXAKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCXByb2Nlc3NvcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIVTGlzdCBzaXplIGV4Y2VlZHMgMTAwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAECCEFtZXJpY2FzCQCRAwIFAXIAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAECBkV1cm9wZQkAkQMCBQFyAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBAgRBc2lhCQCRAwIFAXIAAgkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAECBkFmcmljYQkAkQMCBQFyAAMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBAgdPY2VhbmlhCQCRAwIFAXIABAUDbmlsAAABaQEPZml4U3Rha2VkUGllY2VzAQdhZGRyZXNzAwkBAiE9AggFAWkGY2FsbGVyBQxyZXN0Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAxzdGFrZWRQaWVjZXMDCQAAAgUHYWRkcmVzcwIAAAAECGxhbmRzU3RyCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFB2FkZHJlc3MEBWxhbmRzAwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfBQNuaWwKAQdvbmVMYW5kAgNhY2MLbGFuZEFzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQECGxhbmRTaXplCQCRAwIJALUJAggF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dWxkIG5vdCBjb250YWluICdfXyc6IAUKY3VzdG9tTmFtZQMJAGYCCQCxAgEFCmN1c3RvbU5hbWUFCk1BWE5BTUVMRU4JAAIBCQCsAgICGU5hbWUgdG9vIGxvbmcsIG1heExlbmd0aD0JAKQDAQUKTUFYTkFNRUxFTgQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEB2FjdGlvbnMEByRtYXRjaDAFBHR5cGUDCQAAAgIHQUNDT1VOVAUHJG1hdGNoMAQKcmV2ZXJzZUtleQkBFmtleUN1c3RvbU5hbWVUb0FkZHJlc3MBBQpjdXN0b21OYW1lBAluYW1lT3duZXIJAKIIAQUKcmV2ZXJzZUtleQMJAQlpc0RlZmluZWQBBQluYW1lT3duZXIJAAIBCQCsAgICGU5hbWUgYWxyZWFkeSByZWdpc3RlcmVkOiAFCmN1c3RvbU5hbWUEDWFkZHJUb05hbWVLZXkJARZrZXlBZGRyZXNzVG9DdXN0b21OYW1lAQUEYWRkcgQHb2xkTmFtZQkAoggBBQ1hZGRyVG9OYW1lS2V5BAdmcmVlT2xkAwkBCWlzRGVmaW5lZAEFB29sZE5hbWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFmtleUN1c3RvbU5hbWVUb0FkZHJlc3MBCQEFdmFsdWUBBQdvbGROYW1lBQNuaWwFA25pbAkAzggCCQDNCAIJAM0IAgUHZnJlZU9sZAkBC1N0cmluZ0VudHJ5AgUNYWRkclRvTmFtZUtleQUKY3VzdG9tTmFtZQkBC1N0cmluZ0VudHJ5AgUKcmV2ZXJzZUtleQUEYWRkcggJARZ1cGRhdGVBY2NTdGF0c0ludGVybmFsAgUEYWRkcgUMeHBDdXN0b21OYW1lAl8xAwkAAAICBExBTkQFByRtYXRjaDAEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUHYXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAnwgBBQd0aW1lS2V5CQACAQkArAICCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFB2Fzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMECnJldmVyc2VLZXkJARprZXlMYW5kQ3VzdG9tTmFtZVRvQXNzZXRJZAEFCmN1c3RvbU5hbWUECW5hbWVPd25lcgkAoggBBQpyZXZlcnNlS2V5AwkBCWlzRGVmaW5lZAEFCW5hbWVPd25lcgkAAgEJAKwCAgIZTmFtZSBhbHJlYWR5IHJlZ2lzdGVyZWQ6IAUKY3VzdG9tTmFtZQQOYXNzZXRUb05hbWVLZXkJARprZXlMYW5kQXNzZXRJZFRvQ3VzdG9tTmFtZQEFB2Fzc2V0SWQEB29sZE5hbWUJAKIIAQUOYXNzZXRUb05hbWVLZXkEB2ZyZWVPbGQDCQEJaXNEZWZpbmVkAQUHb2xkTmFtZQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5TGFuZEN1c3RvbU5hbWVUb0Fzc2V0SWQBCQEFdmFsdWUBBQdvbGROYW1lBQNuaWwFA25pbAkAzggCCQDNCAIJAM0IAgUHZnJlZU9sZAkBC1N0cmluZ0VudHJ5AgUOYXNzZXRUb05hbWVLZXkFCmN1c3RvbU5hbWUJAQtTdHJpbmdFbnRyeQIFCnJldmVyc2VLZXkFB2Fzc2V0SWQICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIFBGFkZHIFDHhwQ3VzdG9tTmFtZQJfMQMJAAACAgREVUNLBQckbWF0Y2gwBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUHYXNzZXRJZAMDCQEBIQEJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkGCQEBIQEJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHIJAAIBCQCsAgIIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEQa2V5RHVja0lkVG9Pd25lcgEFB2Fzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkRVQ0tQUkVGSVgCDSBpcyBub3QgeW91cnMECnJldmVyc2VLZXkJARprZXlEdWNrQ3VzdG9tTmFtZVRvQXNzZXRJZAEFCmN1c3RvbU5hbWUECW5hbWVPd25lcgkAoggBBQpyZXZlcnNlS2V5AwkBCWlzRGVmaW5lZAEFCW5hbWVPd25lcgkAAgEJAKwCAgIZTmFtZSBhbHJlYWR5IHJlZ2lzdGVyZWQ6IAUKY3VzdG9tTmFtZQQOYXNzZXRUb05hbWVLZXkJARprZXlEdWNrQXNzZXRJZFRvQ3VzdG9tTmFtZQEFB2Fzc2V0SWQEB29sZE5hbWUJAKIIAQUOYXNzZXRUb05hbWVLZXkEB2ZyZWVPbGQDCQEJaXNEZWZpbmVkAQUHb2xkTmFtZQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5RHVja0N1c3RvbU5hbWVUb0Fzc2V0SWQBCQEFdmFsdWUBBQdvbGROYW1lBQNuaWwFA25pbAkAzggCCQDNCAIJAM0IAgUHZnJlZU9sZAkBC1N0cmluZ0VudHJ5AgUOYXNzZXRUb05hbWVLZXkFCmN1c3RvbU5hbWUJAQtTdHJpbmdFbnRyeQIFCnJldmVyc2VLZXkFB2Fzc2V0SWQICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQdhc3NldElkBQx4cEN1c3RvbU5hbWUCXzEJAAIBAhNVbmtub3duIGVudGl0eSB0eXBlCQCUCgIJAM4IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDBQ9lY29ub215Q29udHJhY3QIBQNwbXQGYW1vdW50BQt1c2R0QXNzZXRJZAUNcHJvbG9nQWN0aW9ucwAAAWkBDHNldFJlZmVycmFscwIJb2xkUGxheWVyCW5ld1BsYXllcgMJAQIhPQIIBQFpD2NhbGxlclB1YmxpY0tleQUDcHViCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFCW9sZFBsYXllcgkAAgEJAKwCAgIRSW52YWxpZCBhZGRyZXNzOiAFCW9sZFBsYXllcgMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUJbmV3UGxheWVyCQACAQkArAICAhFJbnZhbGlkIGFkZHJlc3M6IAUJbmV3UGxheWVyBAdvbGRzS2V5CQEJa2V5T2xkaWVzAAQEb2xkcwkAoggBBQdvbGRzS2V5BAZvbGRpZXMDCQEJaXNEZWZpbmVkAQUEb2xkcwkAvAkCCQEFdmFsdWUBBQRvbGRzAgFfBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUGb2xkaWVzBQluZXdQbGF5ZXIJAAIBCQCsAgIFCW5ld1BsYXllcgImIGlzIG5vdCBuZXdiaWUgKGFscmVhZHkgaGFzIHJlZmVycmFscykECHJlZkJ5S2V5CQEPa2V5QWRkcmVzc1JlZkJ5AQUJbmV3UGxheWVyBAVyZWZCeQkAoggBBQhyZWZCeUtleQMDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAQlpc0RlZmluZWQBCQCmCAEJAQV2YWx1ZQEFBXJlZkJ5BwkAAgEJAKwCAgkArAICBQluZXdQbGF5ZXICFCBhbHJlYWR5IGhhcyByZWZCeTogCQEFdmFsdWUBBQVyZWZCeQQHcmVmc0tleQkBE2tleUFkZHJlc3NSZWZlcnJhbHMBBQlvbGRQbGF5ZXIEBHJlZnMJAKIIAQUHcmVmc0tleQQJcmVmc0FycmF5AwkBCWlzRGVmaW5lZAEFBHJlZnMJALwJAgkBBXZhbHVlAQUEcmVmcwIBXwUDbmlsAwkBD2NvbnRhaW5zRWxlbWVudAIFCXJlZnNBcnJheQUJbmV3UGxheWVyCQACAQkArAICCQCsAgIJAKwCAgUJb2xkUGxheWVyAhIgYWxyZWFkeSBjb250YWlucyAFCW5ld1BsYXllcgIRIHdpdGhpbiByZWZlcnJhbHMEB25ld1JlZnMJALoJAgkAzQgCBQlyZWZzQXJyYXkFCW5ld1BsYXllcgIBXwQHbmV3T2xkcwMJAQ9jb250YWluc0VsZW1lbnQCBQZvbGRpZXMFCW9sZFBsYXllcgkBBXZhbHVlAQUEb2xkcwkAugkCCQDNCAIFBm9sZGllcwUJb2xkUGxheWVyAgFfCQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQhyZWZCeUtleQUJb2xkUGxheWVyCQDMCAIJAQtTdHJpbmdFbnRyeQIFB3JlZnNLZXkFB25ld1JlZnMJAMwIAgkBC1N0cmluZ0VudHJ5AgUHb2xkc0tleQUHbmV3T2xkcwUDbmlsBQ1wcm9sb2dBY3Rpb25zAAABaQEQZGlzdHJpYnV0ZVBvaW50cwUIc3RyZW5ndGgIYWNjdXJhY3kJaW50ZWxsZWN0CWVuZHVyYW5jZQlkZXh0ZXJpdHkEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAt2aXJ0V2xnRGF0YQkBCWFzQW55TGlzdAEJAPwHBAULd2xnQ29udHJhY3QCEmNoZWNrV2xnWHBSRUFET05MWQkAzAgCBQRhZGRyBQNuaWwFA25pbAQNdmlydFdsZ1BvaW50cwkBBWFzSW50AQkAkQMCBQt2aXJ0V2xnRGF0YQABBA0kdDA5NjUxNDk2OTA0AwkAZwIAAAUNdmlydFdsZ1BvaW50cwkAlAoCAAAFA25pbAQHZGVsdGFYUAkBBWFzSW50AQkA/AcEBQt3bGdDb250cmFjdAIJdGFrZVdsZ1hwCQDMCAIFBGFkZHIFA25pbAUDbmlsAwkAAAIFB2RlbHRhWFAFB2RlbHRhWFAJAJQKAgUNdmlydFdsZ1BvaW50cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVVzZXJMZXZlbAEFBGFkZHIJAQVhc0ludAEJAJEDAgULdmlydFdsZ0RhdGEAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleVVzZXJYUAEFBGFkZHIJAQVhc0ludAEJAJEDAgULdmlydFdsZ0RhdGEAAgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAl3bGdQb2ludHMIBQ0kdDA5NjUxNDk2OTA0Al8xBAp3bGdBY3Rpb25zCAUNJHQwOTY1MTQ5NjkwNAJfMgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBApmcmVlS2V5QWNjCQERa2V5VXNlckZyZWVQb2ludHMBBQRhZGRyBA1mcmVlUG9pbnRzQWNjCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQpmcmVlS2V5QWNjAAAFCXdsZ1BvaW50cwQLZnJlZUtleUR1Y2sJARFrZXlEdWNrRnJlZVBvaW50cwEFC2R1Y2tBc3NldElkBA5mcmVlUG9pbnRzRHVjawkBC3ZhbHVlT3JFbHNlAgkAnwgBBQtmcmVlS2V5RHVjawAABAdzdW1GcmVlCQBkAgUNZnJlZVBvaW50c0FjYwUOZnJlZVBvaW50c0R1Y2sED3N1bVRvRGlzdHJpYnV0ZQkAZAIJAGQCCQBkAgkAZAIFCHN0cmVuZ3RoBQhhY2N1cmFjeQUJaW50ZWxsZWN0BQllbmR1cmFuY2UFCWRleHRlcml0eQMJAGYCBQ9zdW1Ub0Rpc3RyaWJ1dGUFB3N1bUZyZWUJAAIBCQCsAgIJAKwCAgIPVGhlcmUgYXJlIG9ubHkgCQCkAwEFB3N1bUZyZWUCGiBmcmVlIHBvaW50cyB0byBkaXN0cmlidXRlBAhjaGFyc0tleQkBDGtleUR1Y2tDaGFycwEFC2R1Y2tBc3NldElkBAVjaGFycwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFCGNoYXJzS2V5AgkwXzBfMF8wXzACAV8EBm5ld0FjYwkAZQIFDWZyZWVQb2ludHNBY2MFD3N1bVRvRGlzdHJpYnV0ZQkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUKZnJlZUtleUFjYwMJAGYCAAAFBm5ld0FjYwAABQZuZXdBY2MJAMwIAgkBDEludGVnZXJFbnRyeQIFC2ZyZWVLZXlEdWNrAwkAZgIAAAUGbmV3QWNjCQBkAgUOZnJlZVBvaW50c0R1Y2sFBm5ld0FjYwUOZnJlZVBvaW50c0R1Y2sJAMwIAgkBC1N0cmluZ0VudHJ5AgUIY2hhcnNLZXkJALkJAgkAzAgCCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDGNoYXJTdHJlbmd0aAUIc3RyZW5ndGgJAMwIAgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQxjaGFyQWNjdXJhY3kFCGFjY3VyYWN5CQDMCAIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckludGVsbGVjdAUJaW50ZWxsZWN0CQDMCAIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckVuZHVyYW5jZQUJZW5kdXJhbmNlCQDMCAIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckRleHRlcml0eQUJZGV4dGVyaXR5BQNuaWwCAV8FA25pbAUNcHJvbG9nQWN0aW9ucwUKd2xnQWN0aW9ucwAAAWkBHHNwbGl0QnlHbG9iYWxXZWlnaHRzUkVBRE9OTFkBBmFtb3VudAkAlAoCBQNuaWwJARJnZXROZWVkZWRNYXRlcmlhbHMBBQZhbW91bnQBaQEkc3BsaXRCeUdsb2JhbEFuZExvY2FsV2VpZ2h0c1JFQURPTkxZAwltYXRBbW91bnQJcmVzQW1vdW50CHRlcnJhaW5zBA10ZXJyYWluQ291bnRzCQENY291bnRUZXJyYWlucwEFCHRlcnJhaW5zCQCUCgIFA25pbAkAlAoCCQESZ2V0TmVlZGVkTWF0ZXJpYWxzAQUJbWF0QW1vdW50CQETZGlzdHJpYnV0ZUJ5V2VpZ2h0cwIFCXJlc0Ftb3VudAUNdGVycmFpbkNvdW50cwFpARNnZXRCYWNrcGFja1JFQURPTkxZAQtkdWNrQXNzZXRJZAkAlAoCBQNuaWwJALkJAgkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQCAToBaQEUZ2V0V2FyZWhvdXNlUkVBRE9OTFkBC2xhbmRBc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAlsYW5kSW5kZXgJAGkCCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwULcmVjTGFuZFNpemUFBVNTSVpFBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAkAlAoCBQNuaWwJALoJAgkBDGdldFdhcmVob3VzZQMJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAUJbGFuZEluZGV4BQppbmZyYUxldmVsAgE6AWkBCnNhdmVMYXN0VHgAAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQt3bGdDb250cmFjdAkAzAgCBQ9lY29ub215Q29udHJhY3QJAMwIAgUSdG91cm5hbWVudENvbnRyYWN0CQDMCAIFDWFjcmVzQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkAlAoCCQEGcHJvbG9nAQUBaQAqAWkBD3VwZGF0ZUR1Y2tTdGF0cwILZHVja0Fzc2V0SWQHZGVsdGFYUAMJAQIhPQIIBQFpBmNhbGxlcgUPZWNvbm9teUNvbnRyYWN0CQACAQINQWNjZXNzIGRlbmllZAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQFB2RlbHRhWFABaQEOdXBkYXRlQWNjU3RhdHMCBGFkZHIHZGVsdGFYUAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUPZWNvbm9teUNvbnRyYWN0CQDMCAIFDWFjcmVzQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCBQRhZGRyBQdkZWx0YVhQAWkBCWVxdWlwRHVjawEJZXF1aXBtZW50BA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBD2NoZWNrVG91cm5hbWVudAEFC2R1Y2tBc3NldElkCQACAQIZZXF1aXBEdWNrX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhdlcXVpcER1Y2tfY2hlY2tEZWxpdmVyeQQFZXFLZXkJARBrZXlEdWNrRXF1aXBtZW50AQULZHVja0Fzc2V0SWQEC2N1cnJlbnRTZWdzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUFZXFLZXkCFyw7LF8sOyxfLDssXyw7LF8sOyxfLDssAgFfBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQFbmV3RXEJALUJAgUJZXF1aXBtZW50AgFfAwkBAiE9AgkAkAMBBQVuZXdFcQULTlVNU0VHTUVOVFMJAAIBAhZXcm9uZyBlcXVpcG1lbnQgc3RyaW5nBAl0ZW1wUHJvZEIJAQZkcmVzc0IEBQtjdXJyZW50U2VncwkBDnByb2RTdHJUb0J5dGVzAQkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBgUDbmlsBAhzZWdCcEF1eAkAkQMCCQC1CQIJAJEDAgUFbmV3RXEFC3NlZ0JhY2twYWNrAgE7AAEECmJ1ZmZFZmZlY3QDCQAAAgUIc2VnQnBBdXgCAAAABARhdXgwCQCRAwIJALUJAgUIc2VnQnBBdXgCASwAAAMJAAACBQRhdXgwAgAAAAQGaWR4Q250CQC1CQIFBGF1eDACAToEA2lkeAkAkQMCBQZpZHhDbnQAAAQDY250CQCRAwIFBmlkeENudAABAwMDAwMJAAACBQNpZHgCAjA2BgkAAAIFA2lkeAICMDcGCQAAAgUDaWR4AgIwOAkBAiE9AgUDY250AgAHCQBmAgkBDXBhcnNlSW50VmFsdWUBBQNjbnQAAAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAkBDXBhcnNlSW50VmFsdWUBBQNpZHgCAV8FCnJJZHhFZmZlY3QAAAQFc3RhdHMJAQxnZXREdWNrU3RhdHMEBQR0aGlzBQtkdWNrQXNzZXRJZAUKYnVmZkVmZmVjdAYECG5ld1Byb2RCCQEGZHJlc3NCBAUFbmV3RXEFCXRlbXBQcm9kQgcFBXN0YXRzBApuZXdQcm9kU3RyCQEOYnl0ZXNUb1Byb2RTdHIBBQhuZXdQcm9kQgkAlAoCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFZXFLZXkFCWVxdWlwbWVudAkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgUKbmV3UHJvZFN0cgUDbmlsAgE6CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAkAuQkCCQDMCAIJAKQDAQkAkQMCBQVzdGF0cwAHCQDMCAIJAKQDAQkAkQMCBQVzdGF0cwAICQDMCAIJAKQDAQkAkQMCBQVzdGF0cwAJCQDMCAIJAKQDAQkAkQMCBQVzdGF0cwAKCQDMCAIJAKQDAQkAkQMCBQVzdGF0cwALBQNuaWwCAV8FA25pbAUNcHJvbG9nQWN0aW9ucwAAAWkBD2ZvcnRpZmljYXRlTGFuZAILbGFuZEFzc2V0SWQEcGxhbgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEC2R1Y2tBc3NldElkCQELdmFsdWVPckVsc2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICAAQJZHVja1N0YXRzCQEMZ2V0RHVja1N0YXRzBAUEdGhpcwULZHVja0Fzc2V0SWQAAAcEB2ZvcnRLZXkJARdrZXlGb3J0aWZpY2F0aW9uc0J5TGFuZAEFC2xhbmRBc3NldElkBAxjdXJyZW50Rm9ydHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQdmb3J0S2V5Agw6MF8xNTowXzE4OjACAV8EBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQECWxhbmRJbmRleAkAaQIJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIJALUJAggFBWFzc2V0C2Rlc2NyaXB0aW9uAgFfBQtyZWNMYW5kU2l6ZQUFU1NJWkUECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAV3aEtleQkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkBAJ3aAkBDGdldFdhcmVob3VzZQMFBXdoS2V5BQlsYW5kSW5kZXgFCmluZnJhTGV2ZWwEB2N1ckxvZnQJALUJAgkAkQMCBQJ3aAUJd2hJZHhMT0ZUAgFfBARjdXJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHY3VyTG9mdAULdm9sT2NjdXBpZWQEBGN1ckYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdjdXJMb2Z0BQd2b2xGcmVlBAhuZXdGb3J0cwkAtQkCBQRwbGFuAgFfBA8kdDAxMDM3NDIxMDM4NTcJAQVmb3J0QgYFDGN1cnJlbnRGb3J0cwkBDnByb2RTdHJUb0J5dGVzAQkAkQMCBQJ3aAUJd2hJZHhQcm9kBQRjdXJPBQRjdXJGBgUDbmlsBAl0ZW1wUHJvZEIIBQ8kdDAxMDM3NDIxMDM4NTcCXzEEBXRlbXBPCAUPJHQwMTAzNzQyMTAzODU3Al8yBAV0ZW1wRggFDyR0MDEwMzc0MjEwMzg1NwJfMwQPJHQwMTAzODYwMTAzOTU2CQEFZm9ydEIGBQhuZXdGb3J0cwUJdGVtcFByb2RCBQV0ZW1wTwUFdGVtcEYHBQlkdWNrU3RhdHMECG5ld1Byb2RCCAUPJHQwMTAzODYwMTAzOTU2Al8xBARuZXdPCAUPJHQwMTAzODYwMTAzOTU2Al8yBARuZXdGCAUPJHQwMTAzODYwMTAzOTU2Al8zBApuZXdQcm9kU3RyCQEOYnl0ZXNUb1Byb2RTdHIBBQhuZXdQcm9kQgQKbmV3TG9mdFN0cgkAuQkCCQDMCAIJAJEDAgUHY3VyTG9mdAUJdm9sTG9ja2VkCQDMCAIJAKQDAQUEbmV3TwkAzAgCCQCkAwEFBG5ld0YJAMwIAgkAkQMCBQdjdXJMb2Z0BQh2b2xUb3RhbAUDbmlsAgFfCQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQdmb3J0S2V5BQRwbGFuCQDMCAIJAQtTdHJpbmdFbnRyeQIFBXdoS2V5CQC6CQIJAMwIAgkAkQMCBQJ3aAULd2hJZHhMZXZlbHMJAMwIAgkAkQMCBQJ3aAUId2hJZHhSZXMJAMwIAgkAkQMCBQJ3aAUId2hJZHhNYXQJAMwIAgUKbmV3UHJvZFN0cgkAzAgCBQpuZXdMb2Z0U3RyBQNuaWwCAToFA25pbAUNcHJvbG9nQWN0aW9ucwAAAWkBE2luaXREdWNrVG91ckF0dGVtcHQBC2R1Y2tBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBRJ0b3VybmFtZW50Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQEBW1heEhQCQEJbWF4SGVhbHRoAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAQJY3VySGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFAECWN1ckxvY0tleQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBBQljdXJMb2NLZXkFD0RFRkFVTFRMT0NBVElPTgQGbGFzdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAUNbGFzdFRvdXJJZEtleQAABAx0b3VyTG9jYXRpb24JAKwCAgkApAMBBQZsYXN0SWQCBF9UXzAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtleVNhdmVkSGVhbHRoAQULZHVja0Fzc2V0SWQFCWN1ckhlYWx0aAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoBQVtYXhIUAkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQtjdXJMb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCBQljdXJMb2NLZXkFDHRvdXJMb2NhdGlvbgUDbmlsBQx0b3VyTG9jYXRpb24BaQEMYnJlYWtBdHRlbXB0AAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECWN1ckxvY0tleQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBBQljdXJMb2NLZXkFD0RFRkFVTFRMT0NBVElPTgMJAQIhPQIJAJEDAgkAtQkCBQtjdXJMb2NhdGlvbgIBXwUKbG9jSWR4VHlwZQIBVAkAAgECIllvdXIgZHVjayBpcyBub3QgaW4gdGhlIHRvdXJuYW1lbnQEC3NhdmVkSGVhbHRoCQERQGV4dHJOYXRpdmUoMTA1NSkBCQEOa2V5U2F2ZWRIZWFsdGgBBQtkdWNrQXNzZXRJZAQNc2F2ZWRMb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBEGtleVNhdmVkTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkAlAoCCQDNCAIJAM0IAgUNcHJvbG9nQWN0aW9ucwkBDEludGVnZXJFbnRyeQIJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQFC3NhdmVkSGVhbHRoCQELU3RyaW5nRW50cnkCBQljdXJMb2NLZXkFDXNhdmVkTG9jYXRpb24FC2N1ckxvY2F0aW9uAWkBFmV4aXRUb3VybmFtZW50SW50ZXJuYWwBC2R1Y2tBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQINQWNjZXNzIGRlbmllZAQLc2F2ZWRIZWFsdGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ5rZXlTYXZlZEhlYWx0aAEFC2R1Y2tBc3NldElkBA1zYXZlZExvY2F0aW9uCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQFC3NhdmVkSGVhbHRoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUNc2F2ZWRMb2NhdGlvbgUDbmlsBwFpARRleGl0RGVsaXZlcnlJbnRlcm5hbAELZHVja0Fzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg1BY2Nlc3MgZGVuaWVkBAFlCQESZXhpdERlbGl2ZXJ5Q29tbW9uBAULZHVja0Fzc2V0SWQHAAAAAAkAlAoCCQDOCAIIBQFlAl8xCAUBZQJfMgcBaQEQYXV0b0V4aXREZWxpdmVyeQQLZHVja0Fzc2V0SWQFbmV3SFAGcmVhc29uBXNjb3JlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQINQWNjZXNzIGRlbmllZAQBZQkBEmV4aXREZWxpdmVyeUNvbW1vbgQFC2R1Y2tBc3NldElkBgUFbmV3SFAFBXNjb3JlCQCUCgIIBQFlAl8xCQCUCgIIBQFlAl8zCAUBZQJfNAFpAQ5wcmVwYXJlUm9iYmVyeQIHbWVzc2FnZQNzaWcEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBASEBCQDEEwMFB21lc3NhZ2UFA3NpZwUDcHViCQACAQIYc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAVwYXJ0cwkAtQkCCQCwCQEFB21lc3NhZ2UCAXwDCQECIT0CCQCQAwEFBXBhcnRzAAIJAAIBAhRXcm9uZyBtZXNzYWdlIGZvcm1hdAQLZHVja0Fzc2V0SWQJAJEDAgUFcGFydHMAAAMJAQ9jaGVja1RvdXJuYW1lbnQBBQtkdWNrQXNzZXRJZAkAAgECHnByZXBhcmVSb2JiZXJ5X2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhxwcmVwYXJlUm9iYmVyeV9jaGVja0RlbGl2ZXJ5BAdyb2JDb3N0CAkBDmdldFJvYmJlcnlEYXRhAgUEdGhpcwULZHVja0Fzc2V0SWQCXzEDCQBmAgUHcm9iQ29zdAUGd2xnQW10CQACAQkArAICCQCsAgIJAKwCAgIIUGF5bWVudCAJAKQDAQUGd2xnQW10AgwgPCByZXF1aXJlZCAJAKQDAQUHcm9iQ29zdAQKY2FuZGlkYXRlcwkAtQkCCQCRAwIFBXBhcnRzAAECAV8EA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWR1Y2tTdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5RHVja1JvYmJlcnlTdGF0ZQEFC2R1Y2tBc3NldElkAAAECmxvY2tlZExhbmQJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBE2tleUxvY2tlZExhbmRCeUR1Y2sBBQtkdWNrQXNzZXRJZAIABAdsYW5kRVRBCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlMYW5kQ29vbGRvd25FVEEBBQpsb2NrZWRMYW5kAAADAwkBAiE9AgUJZHVja1N0YXRlBQtkdWNrSWR4RnJlZQkAZgIFB2xhbmRFVEEFA25vdwcJAAIBCQCsAgICJ1lvdSBhbHJlYWR5IHN0YXJ0ZWQgcm9iYmluZywgd2FpdCB0aWxsIAkApAMBBQdsYW5kRVRBCgEHY2hlY2tlcgIDYWNjC2xhbmRBc3NldElkBAVzdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5TGFuZFJvYmJlcnlTdGF0ZQEFC2xhbmRBc3NldElkAAAEC2Nvb2xkb3duRVRBCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlMYW5kQ29vbGRvd25FVEEBBQtsYW5kQXNzZXRJZAAAAwkAZgIFBXN0YXRlCQCQAwEFEGxhbmRSb2JDb29sZG93bnMJAAIBAg1JbnZhbGlkIHN0YXRlAwkAZgIFA25vdwULY29vbGRvd25FVEEECnN0YWtlZFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAAAwkAZwIAAAUKc3Rha2VkVGltZQUDYWNjBAFhCQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEAWQJALUJAggFAWELZGVzY3JpcHRpb24CAV8EBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgUBZAULcmVjTGFuZFNpemUEDHByb2R1Y3Rpdml0eQkBDGFwcGx5Qm9udXNlcwIFC2xhbmRBc3NldElkBQZwaWVjZXMECWRlbHRhVGltZQkAZQIFA25vdwUKc3Rha2VkVGltZQQIYXZhaWxSZXMJAGsDBQlkZWx0YVRpbWUJAGgCBQxwcm9kdWN0aXZpdHkFBnBpZWNlcwUJREFZTUlMTElTAwkAZgIFDk1JTl9SRVNfVE9fUk9CBQhhdmFpbFJlcwUDYWNjCQDNCAIFA2FjYwULbGFuZEFzc2V0SWQFA2FjYwQIZmlsdGVyZWQKAAIkbAUKY2FuZGlkYXRlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHY2hlY2tlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAAACCQCQAwEFCGZpbHRlcmVkAAAJAAIBAhlObyBjYW5kaWRhdGVzIGZvciByb2JiZXJ5BAZybmRJZHgJAQ9nZXRSYW5kb21OdW1iZXIDCQCQAwEFCGZpbHRlcmVkBQZoZWlnaHQJAMsBAgUDc2lnCAUBaQ10cmFuc2FjdGlvbklkBAtsYW5kQXNzZXRJZAkAkQMCBQhmaWx0ZXJlZAUGcm5kSWR4CQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleUxhbmRSb2JiZXJ5U3RhdGUBBQtsYW5kQXNzZXRJZAUMcm9iSWR4TG9ja2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5TGFuZENvb2xkb3duRVRBAQULbGFuZEFzc2V0SWQJAGQCBQNub3cJAJEDAgUQbGFuZFJvYkNvb2xkb3ducwUMcm9iSWR4TG9ja2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETa2V5RHVja1JvYmJlcnlTdGF0ZQEFC2R1Y2tBc3NldElkBRBkdWNrSWR4UHJlcGFyaW5nCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlMb2NrZWRMYW5kQnlEdWNrAQULZHVja0Fzc2V0SWQFC2xhbmRBc3NldElkBQNuaWwFDXByb2xvZ0FjdGlvbnMFC2xhbmRBc3NldElkAWkBB3JvYkxhbmQCB21lc3NhZ2UDc2lnBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQEhAQkAxBMDBQdtZXNzYWdlBQNzaWcFA3B1YgkAAgECGHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaAQIdXNlckFkZHIJAKUIAQgFAWkGY2FsbGVyBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFCHVzZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQCUCgIJAM0IAgUNcHJvbG9nQWN0aW9ucwkBDEludGVnZXJFbnRyeQIJARhrZXlMYXN0Um9iYmVyeVRpbWVCeUR1Y2sBBQtkdWNrQXNzZXRJZAUDbm93AAABaQEOYWNjZXB0RGVsaXZlcnkAAwkBASEBBRFLU19BTExPV19ERUxJVkVSWQkAAgECH0RlbGl2ZXJ5IGZlYXR1cmUgaXMgdHVybmVkIG9mZiEEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAh1c2VyQWRkcgkApQgBCAUBaQZjYWxsZXIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUIdXNlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9lY29ub215Q29udHJhY3QFD2RlbGl2ZXJ5RnVuZEtleQAABAtsb2NrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9lY29ub215Q29udHJhY3QFEWRlbGl2ZXJ5TG9ja2VkS2V5AAADCQBmAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZCQBlAgUJZnVuZFRvdGFsBQtsb2NrZWRUb3RhbAkAAgEJAKwCAgkArAICCQCsAgICIERlbGl2ZXJ5IGlzIG5vdCBhdmFpbGFibGUsIGZ1bmQ9CQEKZml4ZWRQb2ludAIFCWZ1bmRUb3RhbAAGAgksIGxvY2tlZD0JAQpmaXhlZFBvaW50AgULbG9ja2VkVG90YWwABgQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQIZGVsYXlFVEEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleURlbGl2ZXJ5RGVsYXlCeUR1Y2sBBQtkdWNrQXNzZXRJZAAAAwkAZgIFCGRlbGF5RVRBBQNub3cJAAIBCQCsAgICKkRlbGl2ZXJ5IGlzIGZvcmJpZGRlbiBmb3IgeW91ciBkdWNrIHVudGlsIAkApAMBBQhkZWxheUVUQQMJAQ9jaGVja1RvdXJuYW1lbnQBBQtkdWNrQXNzZXRJZAkAAgECHmFjY2VwdERlbGl2ZXJ5X2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhxhY2NlcHREZWxpdmVyeV9jaGVja0RlbGl2ZXJ5BA5uZXdMb2NrZWRUb3RhbAkBBWFzSW50AQkA/AcEBQ9lY29ub215Q29udHJhY3QCFHVwZGF0ZURlbGl2ZXJ5TG9ja2VkCQDMCAIJAGQCBQtsb2NrZWRUb3RhbAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwFA25pbAQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAECWN1ckhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgFBW1heEhQBAljdXJMb2NLZXkJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAKIIAQUJY3VyTG9jS2V5BQ9ERUZBVUxUTE9DQVRJT04EEGRlbGl2ZXJ5TG9jYXRpb24JAKwCAgkApAMBBQNub3cCBF9EXzAJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5U2F2ZWRIZWFsdGgBBQtkdWNrQXNzZXRJZAUJY3VySGVhbHRoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgFBW1heEhQCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlTYXZlZExvY2F0aW9uAQULZHVja0Fzc2V0SWQFC2N1ckxvY2F0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWN1ckxvY0tleQUQZGVsaXZlcnlMb2NhdGlvbgUDbmlsBQ1wcm9sb2dBY3Rpb25zCQCUCgIFEGRlbGl2ZXJ5TG9jYXRpb24FDm5ld0xvY2tlZFRvdGFsAHqJ2B0=", "height": 2792688, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BCcR2nJfk429egf3icjaXgJdb5QtcoQu5c3oUcArG2xK Next: AT9B6QnaHUvuwepSMjJJo8WP8dL6hKSNDEWqeZ5Gzh2A Diff:
OldNewDifferences
19851985 let curHealth = getIntegerValue(healthKey)
19861986 let outcomeActions = if (if ((distance >= 3))
19871987 then true
1988- else if (check)
1988+ else if (if (check)
19891989 then (score >= 3)
1990+ else false)
1991+ then (newHP > 0)
19901992 else false)
19911993 then {
19921994 let reward = invoke(economyContract, "sendDeliveryReward", [owner], nil)
20042006 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
20052007 let unlock = invoke(economyContract, "updateDeliveryLocked", [(lockedTotal - MIN_USDT_FEE_DELIVERY)], nil)
20062008 if ((unlock == unlock))
2007- then if ((0 >= curHealth))
2009+ then if (if (if (check)
2010+ then (0 >= newHP)
2011+ else false)
2012+ then true
2013+ else (0 >= curHealth))
20082014 then nil
20092015 else [IntegerEntry(keyDeliveryDelayByDuck(duckAssetId), (startTime + DELIVERY_PUNISHMENT))]
20102016 else throw("Strict value is not equal to itself.")
24872493 let isDeliv = (newLoc[locIdxType] == "D")
24882494 let eqKey = keyDuckEquipment(duckAssetId)
24892495 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2490- let $t07033870435 = subtractEquipment(currentEq, f._5)
2491- let newEq = $t07033870435._1
2492- let shouldZeroBuffs = $t07033870435._2
2493- let $t07043873556 = if (!(onMission(tournamentContract, curLocation)))
2496+ let $t07037470471 = subtractEquipment(currentEq, f._5)
2497+ let newEq = $t07037470471._1
2498+ let shouldZeroBuffs = $t07037470471._2
2499+ let $t07047473592 = if (!(onMission(tournamentContract, curLocation)))
24942500 then if (!(isUsualLocation(newLocation)))
24952501 then cheatAttempt(curLocation, newLocation, 5)
24962502 else if ((newHP > 0))
25502556 else throw("Strict value is not equal to itself.")
25512557 }
25522558 }
2553- let locToSave = $t07043873556._1
2554- let hpToSave = $t07043873556._2
2559+ let locToSave = $t07047473592._1
2560+ let hpToSave = $t07047473592._2
25552561 $Tuple2(((([StringEntry(locKey, locToSave), StringEntry(eqKey, newEq), IntegerEntry(keyDuckHealth(duckAssetId), hpToSave)] ++ prologActions) ++ (if (shouldZeroBuffs)
25562562 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
25572563 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
27572763 let newMat = makeString(subtractMaterials(true, mList, EXPMATERIALS), "_")
27582764 let eqKey = keyDuckEquipment(duckAssetId)
27592765 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2760- let $t08099681093 = subtractEquipment(currentEq, f._5)
2761- let newEq = $t08099681093._1
2762- let shouldZeroBuffs = $t08099681093._2
2766+ let $t08103281129 = subtractEquipment(currentEq, f._5)
2767+ let newEq = $t08103281129._1
2768+ let shouldZeroBuffs = $t08103281129._2
27632769 let e = expeditionInternal(i.caller, i.transactionId)
27642770 let id = e._2._1
27652771 let result = if ((0 >= f._1))
31883194 let addr = toString(i.originCaller)
31893195 let virtWlgData = asAnyList(invoke(wlgContract, "checkWlgXpREADONLY", [addr], nil))
31903196 let virtWlgPoints = asInt(virtWlgData[1])
3191- let $t09647896868 = if ((0 >= virtWlgPoints))
3197+ let $t09651496904 = if ((0 >= virtWlgPoints))
31923198 then $Tuple2(0, nil)
31933199 else {
31943200 let deltaXP = asInt(invoke(wlgContract, "takeWlgXp", [addr], nil))
31963202 then $Tuple2(virtWlgPoints, [IntegerEntry(keyUserLevel(addr), asInt(virtWlgData[0])), IntegerEntry(keyUserXP(addr), asInt(virtWlgData[2]))])
31973203 else throw("Strict value is not equal to itself.")
31983204 }
3199- let wlgPoints = $t09647896868._1
3200- let wlgActions = $t09647896868._2
3205+ let wlgPoints = $t09651496904._1
3206+ let wlgActions = $t09651496904._2
32013207 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
32023208 let freeKeyAcc = keyUserFreePoints(addr)
32033209 let freePointsAcc = (valueOrElse(getInteger(freeKeyAcc), 0) + wlgPoints)
33483354 let curO = parseIntValue(curLoft[volOccupied])
33493355 let curF = parseIntValue(curLoft[volFree])
33503356 let newForts = split(plan, "_")
3351- let $t0103706103821 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3352- let tempProdB = $t0103706103821._1
3353- let tempO = $t0103706103821._2
3354- let tempF = $t0103706103821._3
3355- let $t0103824103920 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3356- let newProdB = $t0103824103920._1
3357- let newO = $t0103824103920._2
3358- let newF = $t0103824103920._3
3357+ let $t0103742103857 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3358+ let tempProdB = $t0103742103857._1
3359+ let tempO = $t0103742103857._2
3360+ let tempF = $t0103742103857._3
3361+ let $t0103860103956 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3362+ let newProdB = $t0103860103956._1
3363+ let newO = $t0103860103956._2
3364+ let newF = $t0103860103956._3
33593365 let newProdStr = bytesToProdStr(newProdB)
33603366 let newLoftStr = makeString([curLoft[volLocked], toString(newO), toString(newF), curLoft[volTotal]], "_")
33613367 $Tuple2(([StringEntry(fortKey, plan), StringEntry(whKey, makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], newProdStr, newLoftStr], ":"))] ++ prologActions), 0)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let DAYMILLIS = 86400000
55
66 let DELIVERY_PUNISHMENT = 60000
77
88 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
99
1010
1111 let SCALE8 = 100000000
1212
1313 let xpLevelScale = 3200
1414
1515 let xpLevelRecipPow = 4000
1616
1717 let numPointsOnLevelUp = 3
1818
1919 let robberyCostMin = 100000000
2020
2121 let robberyCooldownCoeff = 400
2222
2323 let requirements = ["Strength", "Accuracy", "Intellect", "Endurance", "Dexterity", "Level", "Health"]
2424
2525 let charStrength = 0
2626
2727 let charAccuracy = 1
2828
2929 let charIntellect = 2
3030
3131 let charEndurance = 3
3232
3333 let charDexterity = 4
3434
3535 let segBackpack = 0
3636
3737 let NUMSEGMENTS = 6
3838
3939 let NUMMAINAUX = 2
4040
4141 let MAXSLOTS = 2
4242
4343 let MAXPRODINSLOT = 30
4444
4545 let landRobCooldowns = [0, 600000, 900000, 43200000, 21600000]
4646
4747 let MIN_RES_TO_ROB = 20000000
4848
4949 let robIdxLocked = 1
5050
5151 let duckIdxFree = 0
5252
5353 let duckIdxPreparing = 1
5454
5555 func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
5656
5757
5858 func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
5959
6060
6161 func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
6262
6363
6464 func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
6565
6666
6767 func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
6868
6969
7070 func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
7171
7272
7373 func keyUserXP (addr) = ("userXP_" + addr)
7474
7575
7676 func keyUserLevel (addr) = ("userLevel_" + addr)
7777
7878
7979 func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
8080
8181
8282 func keySavedHealth (duckAssetId) = ("savedHealth_" + duckAssetId)
8383
8484
8585 func keySavedLocation (duckAssetId) = ("savedLocation_" + duckAssetId)
8686
8787
8888 func keyDuckBuffs (duckAssetId) = ("duckBuffs_" + duckAssetId)
8989
9090
9191 func keyLastRobberyTimeByDuck (duckAssetId) = ("lastRobberyTime_" + duckAssetId)
9292
9393
9494 func keyLastRobberyCostByDuck (duckAssetId) = ("lastRobberyCost_" + duckAssetId)
9595
9696
9797 func keyLandRobberyState (landAssetId) = ("landRobberyState_" + landAssetId)
9898
9999
100100 func keyLandCooldownETA (landAssetId) = ("landCooldownETA_" + landAssetId)
101101
102102
103103 func keyDuckRobberyState (duckAssetId) = ("duckRobberyState_" + duckAssetId)
104104
105105
106106 func keyLockedLandByDuck (duckAssetId) = ("lockedLandByDuck_" + duckAssetId)
107107
108108
109109 func keyDeliveryDelayByDuck (duckAssetId) = ("deliveryDelayByDuck_" + duckAssetId)
110110
111111
112112 let xpClaim = 10000
113113
114114 let xpSuccessFlight = 10000
115115
116116 let xpFailFlight = 2000
117117
118118 let xpCallES = 100000
119119
120120 let xpCustomName = 1000000
121121
122122 let xpNewSLand = 5000000
123123
124124 let xpUpgradeInfra = 10000
125125
126126 let xpMerge = 1000000
127127
128128 let xpOnboard = 1000000
129129
130130 let xpHeal = 10000
131131
132132 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
133133
134134
135135 func maxHealth (level) = (100 + level)
136136
137137
138138 func levelUp (currLevel,newXP) = {
139139 let newLevel = levelByXP(newXP)
140140 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
141141 }
142142
143143
144144 func getDuckStats (stakingContract,duckAssetId,buffEffect,forceBuffs) = {
145145 let chars = split(valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0"), "_")
146146 let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
147147 let health = valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), maxHealth(lvl))
148148 let stateBuffs = split(valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0"), "_")
149149 ([parseIntValue(chars[charStrength]), parseIntValue(chars[charAccuracy]), parseIntValue(chars[charIntellect]), parseIntValue(chars[charEndurance]), parseIntValue(chars[charDexterity]), lvl, health] ++ (if (forceBuffs)
150150 then [buffEffect, buffEffect, buffEffect, buffEffect, buffEffect]
151151 else [parseIntValue(stateBuffs[charStrength]), parseIntValue(stateBuffs[charAccuracy]), parseIntValue(stateBuffs[charIntellect]), parseIntValue(stateBuffs[charEndurance]), parseIntValue(stateBuffs[charDexterity])]))
152152 }
153153
154154
155155 func getRobberyData (stakingContract,duckAssetId) = {
156156 let lastRobCost = valueOrElse(getInteger(stakingContract, keyLastRobberyCostByDuck(duckAssetId)), 0)
157157 let lastRobTime = valueOrElse(getInteger(stakingContract, keyLastRobberyTimeByDuck(duckAssetId)), 0)
158158 let now = lastBlock.timestamp
159159 let robCost = max([robberyCostMin, (lastRobCost - (robberyCooldownCoeff * (now - lastRobTime)))])
160160 let duckState = valueOrElse(getInteger(stakingContract, keyDuckRobberyState(duckAssetId)), 0)
161161 let lockedLand = valueOrElse(getString(stakingContract, keyLockedLandByDuck(duckAssetId)), "")
162162 let landETA = valueOrElse(getInteger(stakingContract, keyLandCooldownETA(lockedLand)), 0)
163163 $Tuple5(robCost, lastRobTime, duckState, lockedLand, landETA)
164164 }
165165
166166
167167 let LANDPREFIX = "LAND"
168168
169169 let DUCKPREFIX = "DUCK"
170170
171171 let ARTPRESALE = "PRESALE"
172172
173173 let NUMRES = 6
174174
175175 let MAX_LANDS_STAKED_BY_USER = 25
176176
177177 let DAILYRESBYPIECE = 3456000
178178
179179 let WHMULTIPLIER = 10000000000
180180
181181 let DEFAULTLOCATION = "Africa_F_Africa"
182182
183183 let RESOURCEPRICEMIN = 39637
184184
185185 let ESSELLCOEF = 10
186186
187187 let MIN_USDT_FEE_DELIVERY = 50000
188188
189189 let TEN_MINUTES_MILLIS = 600000
190190
191191 let prodTypes = ["First Aid Kit L1", "First Aid Kit L2", "First Aid Kit L3", "Backpack L1", "Backpack L2", "Backpack L3", "Food Ration L1", "Food Ration L2", "Food Ration L3", "Jet Pack L1", "Jet Pack L2", "Jet Pack L3", "Shield L1", "Shield L2", "Shield L3", "Mine L1", "Mine L2", "Mine L3", "Trap L1", "Trap L2", "Trap L3"]
192192
193193 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
194194
195195 let COEFF2MAT = 10000000
196196
197197 let fortAllowedProds = [15, 16, 17, 18, 19, 20]
198198
199199 let productionMatrix = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0_", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0_", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0_", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0_001", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0_011", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0_111", "18_18_10_18_18_18_11_4_10_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_22_4_20_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_33_4_30_0,0,0,0,0,0,0_201", "4_13_22_4_35_22_23_0_50,1,0_0,0,0,0,0,0,0_", "4_13_22_4_35_22_46_0_50,1,1_0,2,5,0,0,0,0_", "4_13_22_4_35_22_69_0_50,2,1_0,5,10,0,0,0,0_", "5_25_40_5_10_15_20_1_30,1,1_0,0,0,0,0,0,0_", "5_25_40_5_10_15_40_1_30,1,2_2,1,3,0,0,0,0_", "5_25_40_5_10_15_60_1_30,1,3_5,2,8,0,0,0,0_"]
200200
201201 let rIdxCoeff = 6
202202
203203 let rIdxEffect = 8
204204
205205 let rIdxRequirements = 9
206206
207207 let rIdxSlots = 10
208208
209209 let PRODUCTPKGSIZE = 10
210210
211211 let whIdxLevels = 0
212212
213213 let whIdxRes = 1
214214
215215 let whIdxMat = 2
216216
217217 let whIdxProd = 3
218218
219219 let whIdxLOFT = 4
220220
221221 let volLocked = 0
222222
223223 let volOccupied = 1
224224
225225 let volFree = 2
226226
227227 let volTotal = 3
228228
229229 let bpIdxLevel = 0
230230
231231 let bpIdxRes = 1
232232
233233 let bpIdxMat = 2
234234
235235 let bpIdxProd = 3
236236
237237 let locIdxContinent = 0
238238
239239 let locIdxType = 1
240240
241241 let locIdxId = 2
242242
243243 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
244244
245245
246246 func keyLandAssetIdToCustomName (assetId) = ("lcna_" + assetId)
247247
248248
249249 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
250250
251251
252252 func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["las", type, assetId], "_")
253253
254254
255255 func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("sttao_" + nftType) + "_") + assetId) + "_") + ownerAddr)
256256
257257
258258 func keyWarehouseByLand (landAssetId) = ("wh_" + landAssetId)
259259
260260
261261 func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
262262
263263
264264 func keyFortificationsByLand (landAssetId) = ("fortifications_" + landAssetId)
265265
266266
267267 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
268268
269269
270270 func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
271271
272272
273273 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
274274
275275
276276 func keyOnboardArtActivatedOnDuck (duckAssetId) = ("onboardArtActivatedOnDuck_" + duckAssetId)
277277
278278
279279 func keyOnboardArtDuckActivatedBy (addr) = ("onboardArtActivatedDuckBy_" + addr)
280280
281281
282282 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
283283
284284
285285 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
286286
287287
288288 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
289289
290290
291291 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
292292
293293
294294 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
295295
296296
297297 func keyUserGwlReleaseTime (userAddr) = ("%s%s__userGwlReleaseTime__" + userAddr)
298298
299299
300300 func keyEsWarehouse () = "emergencyWarehouseProducts"
301301
302302
303303 let deliveryFundKey = "deliveryFund"
304304
305305 let deliveryLockedKey = "deliveryLocked"
306306
307307 let lastTourIdKey = "%s__lastTourId"
308308
309309 func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
310310
311311
312312 func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
313313
314314
315315 func keyBestResultByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(tId), duckAssetId], "__")
316316
317317
318318 let idxStatic = 0
319319
320320 let idxDynamic = 1
321321
322322 let tStaticEnd = 6
323323
324324 let tDynamicStatus = 1
325325
326326 func getTourData (tourContract,tId) = {
327327 let static = split(valueOrErrorMessage(getString(tourContract, keyTourStaticDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
328328 let dynamic = split_4C(valueOrErrorMessage(getString(tourContract, keyTourDynamicDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
329329 [static, dynamic]
330330 }
331331
332332
333333 func isInTournament (tourContract,location) = {
334334 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
335335 let loc = split(location, "_")
336336 let now = lastBlock.timestamp
337337 let tData = getTourData(tourContract, lastId)
338338 let static = tData[idxStatic]
339339 let dynamic = tData[idxDynamic]
340340 if (if (if ((loc[locIdxType] == "T"))
341341 then (parseIntValue(loc[locIdxContinent]) == lastId)
342342 else false)
343343 then (dynamic[tDynamicStatus] == "INPROGRESS")
344344 else false)
345345 then (parseIntValue(static[tStaticEnd]) > now)
346346 else false
347347 }
348348
349349
350350 func isInDelivery (location) = {
351351 let loc = split(location, "_")
352352 let now = lastBlock.timestamp
353353 let startTime = parseIntValue(loc[locIdxContinent])
354354 let distance = parseIntValue(loc[locIdxId])
355355 if (if ((loc[locIdxType] == "D"))
356356 then ((startTime + TEN_MINUTES_MILLIS) > now)
357357 else false)
358358 then (3 >= distance)
359359 else false
360360 }
361361
362362
363363 func isUsualLocation (location) = {
364364 let locType = split(location, "_")[locIdxType]
365365 if ((locType != "T"))
366366 then (locType != "D")
367367 else false
368368 }
369369
370370
371371 func onMission (tourContract,location) = {
372372 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
373373 let loc = split(location, "_")
374374 let now = lastBlock.timestamp
375375 let tData = getTourData(tourContract, lastId)
376376 let static = tData[idxStatic]
377377 let dynamic = tData[idxDynamic]
378378 let locType = loc[locIdxType]
379379 if ((locType == "D"))
380380 then true
381381 else if (if (if ((loc[locIdxType] == "T"))
382382 then (parseIntValue(loc[locIdxContinent]) == lastId)
383383 else false)
384384 then (dynamic[tDynamicStatus] == "INPROGRESS")
385385 else false)
386386 then (parseIntValue(static[tStaticEnd]) > now)
387387 else false
388388 }
389389
390390
391391 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
392392
393393
394394 func cheatAttempt (oldLoc,newLoc,cheatCase) = throw(((((("Cheat attempt: oldLoc=" + oldLoc) + ", newLoc=") + newLoc) + ", case=") + toString(cheatCase)))
395395
396396
397397 let KS_SEPARATE_PUBLIC_KEY = false
398398
399399 let KS_ALLOW_BIG_INFRA_MERGE = false
400400
401401 let KS_ALLOW_DELIVERY = true
402402
403403 let chain = take(drop(this.bytes, 1), 1)
404404
405405 let usdtAssetId = match chain {
406406 case _ =>
407407 if ((base58'2W' == $match0))
408408 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
409409 else if ((base58'2T' == $match0))
410410 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
411411 else throw("Unknown chain")
412412 }
413413
414414 let defaultRestAddressStr = match chain {
415415 case _ =>
416416 if ((base58'2W' == $match0))
417417 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
418418 else if ((base58'2T' == $match0))
419419 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
420420 else throw("Unknown chain")
421421 }
422422
423423 let InfraUpgradeCostS = match chain {
424424 case _ =>
425425 if ((base58'2W' == $match0))
426426 then 10000000000
427427 else if ((base58'2T' == $match0))
428428 then 100000000
429429 else throw("Unknown chain")
430430 }
431431
432432 let arbitrageDelay = match chain {
433433 case _ =>
434434 if ((base58'2W' == $match0))
435435 then 86400000
436436 else if ((base58'2T' == $match0))
437437 then 60000
438438 else throw("Unknown chain")
439439 }
440440
441441 let SEP = "__"
442442
443443 let MULT6 = 1000000
444444
445445 let MULT8 = 100000000
446446
447447 let SSIZE = 25
448448
449449 let MSIZE = 100
450450
451451 let LSIZE = 225
452452
453453 let XLSIZE = 400
454454
455455 let XXLSIZE = 625
456456
457457 let ITER6 = [0, 1, 2, 3, 4, 5]
458458
459459 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
460460
461461
462462 let IdxCfgStakingDapp = 1
463463
464464 let IdxCfgEconomyDapp = 2
465465
466466 let IdxCfgGovernanceDapp = 3
467467
468468 let IdxCfgWlgDapp = 4
469469
470470 let IdxCfgTournamentDapp = 7
471471
472472 let IdxCfgAcresDapp = 8
473473
474474 func keyRestCfg () = "%s__restConfig"
475475
476476
477477 func keyRestAddress () = "%s__restAddr"
478478
479479
480480 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
481481
482482
483483 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
484484
485485
486486 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
487487
488488 let restCfg = readRestCfgOrFail(restContract)
489489
490490 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
491491
492492 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
493493
494494 let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
495495
496496 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
497497
498498 let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
499499
500500 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
501501
502502 let recLandNum = 0
503503
504504 let recLandSize = 1
505505
506506 let recTerrains = 2
507507
508508 let recContinent = 3
509509
510510 let wlgAssetIdKey = "wlg_assetId"
511511
512512 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
513513
514514 let acresAssetIdKey = "acresAssetId"
515515
516516 let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
517517
518518 let randomDelay = 2
519519
520520 func keyCommit (address) = ("finishBlockForAddr_" + address)
521521
522522
523523 func keyResProportions () = "resTypesProportions"
524524
525525
526526 func keyResTypesByContinent (continent) = ("resTypesByContinent_" + continent)
527527
528528
529529 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
530530
531531
532532 func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
533533
534534
535535 func asString (v) = match v {
536536 case s: String =>
537537 s
538538 case _ =>
539539 throw("fail to cast into String")
540540 }
541541
542542
543543 func asInt (v) = match v {
544544 case n: Int =>
545545 n
546546 case _ =>
547547 throw("fail to cast into Int")
548548 }
549549
550550
551551 func asAnyList (v) = match v {
552552 case l: List[Any] =>
553553 l
554554 case _ =>
555555 throw("fail to cast into List[Any]")
556556 }
557557
558558
559559 func asBoolean (v) = match v {
560560 case s: Boolean =>
561561 s
562562 case _ =>
563563 throw("fail to cast into Boolean")
564564 }
565565
566566
567567 func asStringIntTuple (val) = match val {
568568 case t2: (String, Int) =>
569569 t2
570570 case _ =>
571571 throw("fail to cast into (String, Int)")
572572 }
573573
574574
575575 func numPiecesBySize (landSize) = match landSize {
576576 case _ =>
577577 if (("S" == $match0))
578578 then SSIZE
579579 else if (("M" == $match0))
580580 then MSIZE
581581 else if (("L" == $match0))
582582 then LSIZE
583583 else if (("XL" == $match0))
584584 then XLSIZE
585585 else if (("XXL" == $match0))
586586 then XXLSIZE
587587 else throw("Unknown land size")
588588 }
589589
590590
591591 func isDigit (s) = isDefined(parseInt(s))
592592
593593
594594 func keyBlocked () = "contractsBlocked"
595595
596596
597597 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
598598
599599
600600 func fixedPoint (val,decimals) = {
601601 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
602602 let lowPart = toString((val % tenPow))
603603 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
604604 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
605605 }
606606
607607
608608 func getRandomNumber (maxValue,finishHeight,auxEntropy) = {
609609 let randomSeedBlock = value(blockInfoByHeight(finishHeight))
610610 let randomHash = sha256((value(randomSeedBlock.vrf) + auxEntropy))
611611 (toInt(randomHash) % maxValue)
612612 }
613613
614614
615615 let incubatorAddr = match chain {
616616 case _ =>
617617 if ((base58'2W' == $match0))
618618 then addressFromStringValue("3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv")
619619 else if ((base58'2T' == $match0))
620620 then this
621621 else throw("Unknown chain")
622622 }
623623
624624 let breederAddr = match chain {
625625 case _ =>
626626 if ((base58'2W' == $match0))
627627 then addressFromStringValue("3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb")
628628 else if ((base58'2T' == $match0))
629629 then this
630630 else throw("Unknown chain")
631631 }
632632
633633 let pub = match chain {
634634 case _ =>
635635 if ((base58'2W' == $match0))
636636 then if (KS_SEPARATE_PUBLIC_KEY)
637637 then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
638638 else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
639639 else if ((base58'2T' == $match0))
640640 then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
641641 else throw("Unknown chain")
642642 }
643643
644644 let EMPTY_PROD50 = base64'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='
645645
646646 let FIVEMINUTESMILLIS = 300000
647647
648648 let RENAMINGCOST = 5000000
649649
650650 let MAXNAMELEN = 50
651651
652652 let InfraUpgradeCostSUsdt = 10000000
653653
654654 let EXPMATERIALS = match chain {
655655 case _ =>
656656 if ((base58'2W' == $match0))
657657 then 252289527462
658658 else if ((base58'2T' == $match0))
659659 then 2522895274
660660 else throw("Unknown chain")
661661 }
662662
663663 let EXPUSDT = match chain {
664664 case _ =>
665665 if ((base58'2W' == $match0))
666666 then 250000000
667667 else if ((base58'2T' == $match0))
668668 then 250000000
669669 else throw("Unknown chain")
670670 }
671671
672672 let S_COST_ACRES = 2500000000
673673
674674 let FIVEX = toBigInt(5)
675675
676676 let TWENTYX = toBigInt(20)
677677
678678 let TWENTY2X = toBigInt((20 * 20))
679679
680680 let TWENTY3X = toBigInt(((20 * 20) * 20))
681681
682682 let TWENTY4X = toBigInt((((20 * 20) * 20) * 20))
683683
684684 let TWENTY5X = toBigInt(((((20 * 20) * 20) * 20) * 20))
685685
686686 let PRESALENUMLANDS = 500
687687
688688 func keyNextFreeLandNum () = "nextLandNum"
689689
690690
691691 func keyLandCustomNameToAssetId (name) = ("lcn_" + name)
692692
693693
694694 func keyLandToAssetId (landNum) = ("la_" + landNum)
695695
696696
697697 func keyInfraLevelByAssetIdAndOwner (assetId,ownerAddr) = ((("ilao_" + assetId) + "_") + ownerAddr)
698698
699699
700700 func keyLandNumToOwner (landNum) = ("lo_" + landNum)
701701
702702
703703 func keyDuckCustomNameToAssetId (name) = ("duckByCustomName_" + name)
704704
705705
706706 func keyCustomNameToAddress (name) = ("accountByCustomName_" + name)
707707
708708
709709 func keyOldies () = "oldiesList"
710710
711711
712712 let claimModeWh = 0
713713
714714 let claimModeDuck = 1
715715
716716 let claimModeWhThenDuck = 2
717717
718718 let flHealth = 0
719719
720720 let flTimestamp = 5
721721
722722 let flBonus = 6
723723
724724 let flProdsUsed = 7
725725
726726 func nftName (landNum,landSize) = ((LANDPREFIX + landNum) + landSize)
727727
728728
729729 func toVolume (amount,pkgSize) = {
730730 let pkgs = if ((amount >= 0))
731731 then (((amount + pkgSize) - 1) / pkgSize)
732732 else -((((-(amount) + pkgSize) - 1) / pkgSize))
733733 (pkgs * MULT8)
734734 }
735735
736736
737737 func distributeByWeights (total,weights) = {
738738 let sum = (((((weights[0] + weights[1]) + weights[2]) + weights[3]) + weights[4]) + weights[5])
739739 if ((0 >= sum))
740740 then throw("Zero weights sum")
741741 else {
742742 let norm6 = fraction(total, MULT6, sum)
743743 func normalizer (acc,elem) = (acc :+ fraction(elem, norm6, MULT6))
744744
745745 let $l = weights
746746 let $s = size($l)
747747 let $acc0 = nil
748748 func $f0_1 ($a,$i) = if (($i >= $s))
749749 then $a
750750 else normalizer($a, $l[$i])
751751
752752 func $f0_2 ($a,$i) = if (($i >= $s))
753753 then $a
754754 else throw("List size exceeds 6")
755755
756756 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
757757 }
758758 }
759759
760760
761761 func getNeededMaterials (total) = {
762762 let props = split(value(getString(keyResProportions())), "_")
763763 if ((size(props) != NUMRES))
764764 then throw("Wrong proportions data")
765765 else {
766766 let r = [parseIntValue(props[0]), parseIntValue(props[1]), parseIntValue(props[2]), parseIntValue(props[3]), parseIntValue(props[4]), parseIntValue(props[5])]
767767 distributeByWeights(total, r)
768768 }
769769 }
770770
771771
772772 func subtractMaterials (shouldUseMat,has,totalNeed) = {
773773 let need = getNeededMaterials(totalNeed)
774774 func subtractor (acc,idx) = {
775775 let result = (parseIntValue(has[idx]) - need[idx])
776776 if ((0 > result))
777777 then throw(((((("Not enough material idx=" + toString(idx)) + ", you have ") + has[idx]) + ", but need ") + toString(need[idx])))
778778 else (acc :+ toString(result))
779779 }
780780
781781 if (shouldUseMat)
782782 then {
783783 let $l = ITER6
784784 let $s = size($l)
785785 let $acc0 = nil
786786 func $f0_1 ($a,$i) = if (($i >= $s))
787787 then $a
788788 else subtractor($a, $l[$i])
789789
790790 func $f0_2 ($a,$i) = if (($i >= $s))
791791 then $a
792792 else throw("List size exceeds 6")
793793
794794 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
795795 }
796796 else has
797797 }
798798
799799
800800 func subtractEquipment (oldEq,pUsed) = if ((pUsed == ""))
801801 then $Tuple2(oldEq, false)
802802 else {
803803 func subUsed (acc,idxAmt) = {
804804 let parts = split(idxAmt, ",")
805805 if ((size(parts) != 2))
806806 then throw("Incorrect format, should be index,amount")
807807 else {
808808 let idx = parseIntValue(parts[0])
809809 if (if ((0 > idx))
810810 then true
811811 else (idx >= size(productionMatrix)))
812812 then throw("Unknown product idx")
813813 else {
814814 let amt = parseIntValue(parts[1])
815815 let eqParts = split(acc._1, (parts[0] + ":"))
816816 if ((size(eqParts) != 2))
817817 then throw((("You don't have " + prodTypes[idx]) + " equipped"))
818818 else {
819819 let tmp = eqParts[1]
820820 let numLen = if (isDigit(take(drop(tmp, 1), 1)))
821821 then 2
822822 else 1
823823 let curr = parseIntValue(take(tmp, numLen))
824824 let tail = drop(tmp, numLen)
825825 let newAmt = if ((curr >= amt))
826826 then (curr - amt)
827827 else throw(((((("You equipped " + toString(curr)) + " of ") + prodTypes[idx]) + ", but tried to use ") + toString(amt)))
828828 $Tuple2(((((eqParts[0] + parts[0]) + ":") + toString(newAmt)) + tail), if (acc._2)
829829 then true
830830 else if (if ((idx >= 6))
831831 then (8 >= idx)
832832 else false)
833833 then (newAmt == 0)
834834 else false)
835835 }
836836 }
837837 }
838838 }
839839
840840 let $l = split(pUsed, "_")
841841 let $s = size($l)
842842 let $acc0 = $Tuple2(oldEq, false)
843843 func $f0_1 ($a,$i) = if (($i >= $s))
844844 then $a
845845 else subUsed($a, $l[$i])
846846
847847 func $f0_2 ($a,$i) = if (($i >= $s))
848848 then $a
849849 else throw("List size exceeds 10")
850850
851851 $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)
852852 }
853853
854854
855855 func prodStrToBytes (prodStr) = {
856856 let pList = if ((prodStr == ""))
857857 then nil
858858 else split_4C(prodStr, "_")
859859 func toBV (acc,recipe) = {
860860 let j = (size(acc) / 8)
861861 let curr = if ((size(pList) > j))
862862 then parseIntValue(pList[j])
863863 else 0
864864 (acc + toBytes(curr))
865865 }
866866
867867 let $l = productionMatrix
868868 let $s = size($l)
869869 let $acc0 = base58''
870870 func $f0_1 ($a,$i) = if (($i >= $s))
871871 then $a
872872 else toBV($a, $l[$i])
873873
874874 func $f0_2 ($a,$i) = if (($i >= $s))
875875 then $a
876876 else throw("List size exceeds 50")
877877
878878 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
879879 }
880880
881881
882882 func bytesToProdStr (bv) = {
883883 func fromBV (acc,recipe) = {
884884 let j = size(acc)
885885 let b = take(drop(bv, (8 * j)), 8)
886886 (acc :+ toString(toInt(b)))
887887 }
888888
889889 makeString_2C({
890890 let $l = productionMatrix
891891 let $s = size($l)
892892 let $acc0 = nil
893893 func $f0_1 ($a,$i) = if (($i >= $s))
894894 then $a
895895 else fromBV($a, $l[$i])
896896
897897 func $f0_2 ($a,$i) = if (($i >= $s))
898898 then $a
899899 else throw("List size exceeds 50")
900900
901901 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
902902 }, "_")
903903 }
904904
905905
906906 func checkStatRequirements (duckStats,reqs) = {
907907 func check (acc,j) = {
908908 let buff = if ((size(duckStats) > (7 + j)))
909909 then duckStats[(7 + j)]
910910 else 0
911911 if ((parseIntValue(reqs[j]) > (duckStats[j] + buff)))
912912 then throw(("Requirement not satisfied: " + requirements[j]))
913913 else true
914914 }
915915
916916 let $l = [0, 1, 2, 3, 4, 5, 6]
917917 let $s = size($l)
918918 let $acc0 = false
919919 func $f0_1 ($a,$i) = if (($i >= $s))
920920 then $a
921921 else check($a, $l[$i])
922922
923923 func $f0_2 ($a,$i) = if (($i >= $s))
924924 then $a
925925 else throw("List size exceeds 7")
926926
927927 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
928928 }
929929
930930
931931 func placeProdB (idxCnt,pList,isPositive,duckStats,occupied,free) = {
932932 let parts = split(idxCnt, ":")
933933 if ((size(parts) != 2))
934934 then throw("Incorrect format, should be index:amount")
935935 else if (if (!(isPositive))
936936 then (size(parts[0]) != 2)
937937 else false)
938938 then throw("Product idx should be 2 digits, zero padded")
939939 else {
940940 let productIdx = parseIntValue(parts[0])
941941 let count = parseIntValue(parts[1])
942942 if (!(containsElement(fortAllowedProds, productIdx)))
943943 then throw((("Product '" + prodTypes[productIdx]) + "' cannot be used for land defense"))
944944 else if ((0 > count))
945945 then throw("Count can't be negative")
946946 else if ((count > MAXPRODINSLOT))
947947 then throw(((("Can't put more than " + toString(MAXPRODINSLOT)) + " of ") + prodTypes[productIdx]))
948948 else if ((count == 0))
949949 then $Tuple3(pList, occupied, free)
950950 else {
951951 let head = take(pList, (8 * productIdx))
952952 let curr = toInt(take(drop(pList, (8 * productIdx)), 8))
953953 let tail = drop(pList, (8 * (productIdx + 1)))
954954 let recipe = split(productionMatrix[productIdx], "_")
955955 if (if (!(isPositive))
956956 then (count > curr)
957957 else false)
958958 then throw(((((("You have " + toString(curr)) + " of ") + prodTypes[productIdx]) + ", but tried to use ") + toString(count)))
959959 else {
960960 let newAmt = if (if (!(isPositive))
961961 then checkStatRequirements(duckStats, split(recipe[rIdxRequirements], ","))
962962 else false)
963963 then (curr - count)
964964 else (curr + count)
965965 let deltaVol = (toVolume(newAmt, PRODUCTPKGSIZE) - toVolume(curr, PRODUCTPKGSIZE))
966966 $Tuple3(((head + toBytes(newAmt)) + tail), (occupied + deltaVol), (free - deltaVol))
967967 }
968968 }
969969 }
970970 }
971971
972972
973973 func addProdB (idxCnt,pList,isPositive,segment,mainAux,slot,duckStats) = {
974974 let parts = split(idxCnt, ":")
975975 if ((size(parts) != 2))
976976 then throw("Incorrect format, should be index:amount")
977977 else if (if (!(isPositive))
978978 then (size(parts[0]) != 2)
979979 else false)
980980 then throw("Product idx should be 2 digits, zero padded")
981981 else {
982982 let productIdx = parseIntValue(parts[0])
983983 let count = parseIntValue(parts[1])
984984 if (if ((0 > productIdx))
985985 then true
986986 else (productIdx >= size(productionMatrix)))
987987 then throw("Unknown product idx")
988988 else if ((0 > count))
989989 then throw("Count can't be negative")
990990 else if ((count > MAXPRODINSLOT))
991991 then throw(((("Can't put more than " + toString(MAXPRODINSLOT)) + " of ") + prodTypes[productIdx]))
992992 else if ((count == 0))
993993 then $Tuple2(pList, false)
994994 else {
995995 let head = take(pList, (8 * productIdx))
996996 let curr = toInt(take(drop(pList, (8 * productIdx)), 8))
997997 let tail = drop(pList, (8 * (productIdx + 1)))
998998 let recipe = split(productionMatrix[productIdx], "_")
999999 if (if (!(isPositive))
10001000 then (count > curr)
10011001 else false)
10021002 then throw(((((("You have " + toString(curr)) + " of ") + prodTypes[productIdx]) + ", but tried to use ") + toString(count)))
10031003 else {
10041004 let isBigItem = if (if (!(isPositive))
10051005 then checkStatRequirements(duckStats, split(recipe[rIdxRequirements], ","))
10061006 else false)
10071007 then {
10081008 let compat = recipe[rIdxSlots]
10091009 if ((compat == ""))
10101010 then throw("Item cannot be equipped")
10111011 else {
10121012 let c = parseIntValue(compat)
10131013 let cSeg = (c / 100)
10141014 if ((segment != cSeg))
10151015 then throw("Segment incompatible")
10161016 else {
10171017 let cMainAux = ((c % 100) / 10)
10181018 if ((mainAux != cMainAux))
10191019 then throw("Slot incompatible")
10201020 else {
10211021 let cNumSlots = (c % 10)
10221022 if (if ((slot != 0))
10231023 then (cNumSlots > 1)
10241024 else false)
10251025 then throw("Big items should occupy slot 0")
10261026 else (cNumSlots > 1)
10271027 }
10281028 }
10291029 }
10301030 }
10311031 else false
10321032 $Tuple2(((head + toBytes((curr + (if (isPositive)
10331033 then count
10341034 else -(count))))) + tail), isBigItem)
10351035 }
10361036 }
10371037 }
10381038 }
10391039
10401040
10411041 func slotsGroupB (g,bpIn,isPositive,segment,mainAux,stats) = if ((g != ""))
10421042 then {
10431043 let slots = split(g, ",")
10441044 if ((size(slots) > MAXSLOTS))
10451045 then throw("Wrong slots format")
10461046 else {
10471047 let s0 = slots[0]
10481048 let s1 = if ((size(slots) > 1))
10491049 then slots[1]
10501050 else ""
10511051 if (if ((s0 == ""))
10521052 then (s1 == "")
10531053 else false)
10541054 then bpIn
10551055 else {
10561056 let tmpS0 = if ((s0 != ""))
10571057 then addProdB(s0, bpIn, isPositive, segment, mainAux, 0, stats)
10581058 else $Tuple2(bpIn, false)
10591059 if ((s1 != ""))
10601060 then if (tmpS0._2)
10611061 then throw("Big item already occupies slot")
10621062 else addProdB(s1, tmpS0._1, isPositive, segment, mainAux, 1, stats)._1
10631063 else tmpS0._1
10641064 }
10651065 }
10661066 }
10671067 else bpIn
10681068
10691069
10701070 func dressB (segList,pBytes,isPositive,stats) = {
10711071 func segment (acc,seg) = {
10721072 let j = acc._1
10731073 let mainAux = split(seg, ";")
10741074 if ((size(mainAux) != NUMMAINAUX))
10751075 then throw("Wrong segment format")
10761076 else {
10771077 let m = mainAux[0]
10781078 let a = mainAux[1]
10791079 if (if ((m == ""))
10801080 then (a == "")
10811081 else false)
10821082 then $Tuple2((j + 1), acc._2)
10831083 else {
10841084 let tmpM = slotsGroupB(m, acc._2, isPositive, j, 0, stats)
10851085 $Tuple2((j + 1), slotsGroupB(a, tmpM, isPositive, j, 1, stats))
10861086 }
10871087 }
10881088 }
10891089
10901090 ( let $l = segList
10911091 let $s = size($l)
10921092 let $acc0 = $Tuple2(0, pBytes)
10931093 func $f0_1 ($a,$i) = if (($i >= $s))
10941094 then $a
10951095 else segment($a, $l[$i])
10961096
10971097 func $f0_2 ($a,$i) = if (($i >= $s))
10981098 then $a
10991099 else throw("List size exceeds 6")
11001100
11011101 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6))._2
11021102 }
11031103
11041104
11051105 func fortB (segList,pBytes,occupied,free,isPositive,duckStats) = if ((3 > size(segList)))
11061106 then throw("At least duck, mines and traps parts are required")
11071107 else {
11081108 func segment (acc,seg) = {
11091109 let j = acc._1
11101110 if ((j == 0))
11111111 then $Tuple4((j + 1), acc._2, acc._3, acc._4)
11121112 else {
11131113 let p = placeProdB(seg, acc._2, isPositive, duckStats, acc._3, acc._4)
11141114 $Tuple4((j + 1), p._1, p._2, p._3)
11151115 }
11161116 }
11171117
11181118 let t = {
11191119 let $l = segList
11201120 let $s = size($l)
11211121 let $acc0 = $Tuple4(0, pBytes, occupied, free)
11221122 func $f0_1 ($a,$i) = if (($i >= $s))
11231123 then $a
11241124 else segment($a, $l[$i])
11251125
11261126 func $f0_2 ($a,$i) = if (($i >= $s))
11271127 then $a
11281128 else throw("List size exceeds 10")
11291129
11301130 $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)
11311131 }
11321132 $Tuple3(t._2, t._3, t._4)
11331133 }
11341134
11351135
11361136 func canWearCurrentEquipment (duckAssetId) = {
11371137 let eqKey = keyDuckEquipment(duckAssetId)
11381138 let currEq = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
11391139 let tempProdB = dressB(currEq, EMPTY_PROD50, true, nil)
11401140 let segBpAux = split(currEq[segBackpack], ";")[1]
11411141 let buffEffect = if ((segBpAux == ""))
11421142 then 0
11431143 else {
11441144 let aux0 = split(segBpAux, ",")[0]
11451145 if ((aux0 == ""))
11461146 then 0
11471147 else {
11481148 let idxCnt = split(aux0, ":")
11491149 let idx = idxCnt[0]
11501150 let cnt = idxCnt[1]
11511151 if (if (if (if (if ((idx == "06"))
11521152 then true
11531153 else (idx == "07"))
11541154 then true
11551155 else (idx == "08"))
11561156 then (cnt != "")
11571157 else false)
11581158 then (parseIntValue(cnt) > 0)
11591159 else false)
11601160 then parseIntValue(split(productionMatrix[parseIntValue(idx)], "_")[rIdxEffect])
11611161 else 0
11621162 }
11631163 }
11641164 let stats = getDuckStats(this, duckAssetId, buffEffect, true)
11651165 let newProdB = dressB(currEq, tempProdB, false, stats)
11661166 (newProdB == newProdB)
11671167 }
11681168
11691169
11701170 func updateProportionsInternal (propList,terrainCounts,landSizeIndex,sign) = if ((size(propList) != NUMRES))
11711171 then throw("Wrong proportions data")
11721172 else {
11731173 func updater (acc,i) = {
11741174 let result = (parseIntValue(propList[i]) + ((sign * terrainCounts[i]) * landSizeIndex))
11751175 if ((0 > result))
11761176 then throw(((((((("Panic! Pieces of type=" + toString(i)) + ", sign=") + toString(sign)) + ", terrainCounts[i]=") + toString(terrainCounts[i])) + ", landSizeIndex=") + toString(landSizeIndex)))
11771177 else (acc :+ toString(result))
11781178 }
11791179
11801180 let $l = ITER6
11811181 let $s = size($l)
11821182 let $acc0 = nil
11831183 func $f0_1 ($a,$i) = if (($i >= $s))
11841184 then $a
11851185 else updater($a, $l[$i])
11861186
11871187 func $f0_2 ($a,$i) = if (($i >= $s))
11881188 then $a
11891189 else throw("List size exceeds 6")
11901190
11911191 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
11921192 }
11931193
11941194
11951195 func updateProportions (terrainCounts,landSizeIndex,sign) = {
11961196 let propList = split(valueOrElse(getString(keyResProportions()), "0_0_0_0_0_0"), "_")
11971197 makeString(updateProportionsInternal(propList, terrainCounts, landSizeIndex, sign), "_")
11981198 }
11991199
12001200
12011201 func countTerrains (terrains) = [(size(split(terrains, "A")) - 1), (size(split(terrains, "B")) - 1), (size(split(terrains, "C")) - 1), (size(split(terrains, "D")) - 1), (size(split(terrains, "E")) - 1), (size(split(terrains, "F")) - 1)]
12021202
12031203
12041204 func addRes (currentRes,terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
12051205 func adder (acc,i) = {
12061206 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
12071207 (acc :+ toString((parseIntValue(currentRes[i]) + resOfType)))
12081208 }
12091209
12101210 let r = {
12111211 let $l = ITER6
12121212 let $s = size($l)
12131213 let $acc0 = nil
12141214 func $f0_1 ($a,$i) = if (($i >= $s))
12151215 then $a
12161216 else adder($a, $l[$i])
12171217
12181218 func $f0_2 ($a,$i) = if (($i >= $s))
12191219 then $a
12201220 else throw("List size exceeds 6")
12211221
12221222 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12231223 }
12241224 makeString(r, "_")
12251225 }
12261226
12271227
12281228 func virtClaim (terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
12291229 func adder (acc,i) = {
12301230 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
12311231 $Tuple2((acc._1 :+ resOfType), (acc._2 + resOfType))
12321232 }
12331233
12341234 let $l = ITER6
12351235 let $s = size($l)
12361236 let $acc0 = $Tuple2(nil, 0)
12371237 func $f0_1 ($a,$i) = if (($i >= $s))
12381238 then $a
12391239 else adder($a, $l[$i])
12401240
12411241 func $f0_2 ($a,$i) = if (($i >= $s))
12421242 then $a
12431243 else throw("List size exceeds 6")
12441244
12451245 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12461246 }
12471247
12481248
12491249 func distributeRes (currentWhRes,currentPackRes,resToClaim,whSpaceLeft) = {
12501250 let resListToClaim = resToClaim._1
12511251 let resAmToClaim = resToClaim._2
12521252 if ((resAmToClaim == 0))
12531253 then $Tuple2(makeString(currentWhRes, "_"), makeString(currentPackRes, "_"))
12541254 else if ((whSpaceLeft >= resAmToClaim))
12551255 then {
12561256 func addLists (acc,i) = (acc :+ toString((parseIntValue(currentWhRes[i]) + resListToClaim[i])))
12571257
12581258 let r = {
12591259 let $l = ITER6
12601260 let $s = size($l)
12611261 let $acc0 = nil
12621262 func $f0_1 ($a,$i) = if (($i >= $s))
12631263 then $a
12641264 else addLists($a, $l[$i])
12651265
12661266 func $f0_2 ($a,$i) = if (($i >= $s))
12671267 then $a
12681268 else throw("List size exceeds 6")
12691269
12701270 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12711271 }
12721272 $Tuple2(makeString(r, "_"), makeString(currentPackRes, "_"))
12731273 }
12741274 else {
12751275 func addPartLists (acc,i) = {
12761276 let whPart = fraction(resListToClaim[i], whSpaceLeft, resAmToClaim)
12771277 $Tuple2((acc._1 :+ toString((parseIntValue(currentWhRes[i]) + whPart))), (acc._2 :+ toString(((parseIntValue(currentPackRes[i]) + resListToClaim[i]) - whPart))))
12781278 }
12791279
12801280 let r = {
12811281 let $l = ITER6
12821282 let $s = size($l)
12831283 let $acc0 = $Tuple2(nil, nil)
12841284 func $f0_1 ($a,$i) = if (($i >= $s))
12851285 then $a
12861286 else addPartLists($a, $l[$i])
12871287
12881288 func $f0_2 ($a,$i) = if (($i >= $s))
12891289 then $a
12901290 else throw("List size exceeds 6")
12911291
12921292 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12931293 }
12941294 $Tuple2(makeString(r._1, "_"), makeString(r._2, "_"))
12951295 }
12961296 }
12971297
12981298
12991299 func abs (x) = if ((x >= toBigInt(0)))
13001300 then x
13011301 else -(x)
13021302
13031303
13041304 let freq = [[6, 9, 14, 15, 16], [5, 8, 13, 14, 15], [1, 4, 9, 10, 15], [1, 6, 7, 15, 19], [4, 7, 8, 13, 18]]
13051305
13061306 func genChar (n,freqs) = {
13071307 let rem = toInt((n % TWENTYX))
13081308 let letter = if ((freqs[0] > rem))
13091309 then "A"
13101310 else if ((freqs[1] > rem))
13111311 then "B"
13121312 else if ((freqs[2] > rem))
13131313 then "C"
13141314 else if ((freqs[3] > rem))
13151315 then "D"
13161316 else if ((freqs[4] > rem))
13171317 then "E"
13181318 else "F"
13191319 letter
13201320 }
13211321
13221322
13231323 func genTerrains (seed,continentIdx) = {
13241324 let f = freq[continentIdx]
13251325 func terrainGenerator (acc,elem) = $Tuple2((((((acc._1 + genChar(acc._2, f)) + genChar((acc._2 / TWENTYX), f)) + genChar((acc._2 / TWENTY2X), f)) + genChar((acc._2 / TWENTY3X), f)) + genChar((acc._2 / TWENTY4X), f)), (acc._2 / TWENTY5X))
13261326
13271327 let t = {
13281328 let $l = [1, 2, 3, 4, 5]
13291329 let $s = size($l)
13301330 let $acc0 = $Tuple2("", (seed / FIVEX))
13311331 func $f0_1 ($a,$i) = if (($i >= $s))
13321332 then $a
13331333 else terrainGenerator($a, $l[$i])
13341334
13351335 func $f0_2 ($a,$i) = if (($i >= $s))
13361336 then $a
13371337 else throw("List size exceeds 5")
13381338
13391339 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
13401340 }
13411341 t._1
13421342 }
13431343
13441344
13451345 let PERM25 = [7, 2, 15, 19, 8, 24, 1, 21, 16, 5, 0, 22, 20, 23, 11, 4, 18, 12, 6, 10, 3, 17, 13, 9, 14]
13461346
13471347 let TCHARS = ["A", "B", "C", "D", "E", "F"]
13481348
13491349 func genTerrainsForMerge (sumTerrains,landSizeIndex) = {
13501350 func step1 (acc,s) = {
13511351 let j = acc._2
13521352 let el = parseIntValue(s)
13531353 let x = if ((el == 0))
13541354 then 0
13551355 else if ((el >= (4 * landSizeIndex)))
13561356 then (el / landSizeIndex)
13571357 else if ((el > (3 * landSizeIndex)))
13581358 then 3
13591359 else (((el - 1) / landSizeIndex) + 1)
13601360 $Tuple3((acc._1 :+ x), (acc._2 + 1), (acc._3 + x))
13611361 }
13621362
13631363 let t = {
13641364 let $l = sumTerrains
13651365 let $s = size($l)
13661366 let $acc0 = $Tuple3(nil, 0, 0)
13671367 func $f0_1 ($a,$i) = if (($i >= $s))
13681368 then $a
13691369 else step1($a, $l[$i])
13701370
13711371 func $f0_2 ($a,$i) = if (($i >= $s))
13721372 then $a
13731373 else throw("List size exceeds 6")
13741374
13751375 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13761376 }
13771377 let arr = t._1
13781378 let maxIdx = value(indexOf(arr, max(arr)))
13791379 let delta = (t._3 - 25)
13801380 func subber (acc,idx) = {
13811381 let val = if ((idx == maxIdx))
13821382 then (arr[idx] - delta)
13831383 else arr[idx]
13841384 let zeroes = if ((val == 0))
13851385 then nil
13861386 else split(drop(toString(pow(10, 0, val, 0, 0, DOWN)), 1), "")
13871387 let c = TCHARS[idx]
13881388 func listGen (ac,ignored) = (ac :+ c)
13891389
13901390 let z = {
13911391 let $l = zeroes
13921392 let $s = size($l)
13931393 let $acc0 = nil
13941394 func $f1_1 ($a,$i) = if (($i >= $s))
13951395 then $a
13961396 else listGen($a, $l[$i])
13971397
13981398 func $f1_2 ($a,$i) = if (($i >= $s))
13991399 then $a
14001400 else throw("List size exceeds 25")
14011401
14021402 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
14031403 }
14041404 (acc ++ z)
14051405 }
14061406
14071407 let r = {
14081408 let $l = ITER6
14091409 let $s = size($l)
14101410 let $acc0 = nil
14111411 func $f1_1 ($a,$i) = if (($i >= $s))
14121412 then $a
14131413 else subber($a, $l[$i])
14141414
14151415 func $f1_2 ($a,$i) = if (($i >= $s))
14161416 then $a
14171417 else throw("List size exceeds 6")
14181418
14191419 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14201420 }
14211421 func permut (acc,j) = (acc + r[j])
14221422
14231423 let $l = PERM25
14241424 let $s = size($l)
14251425 let $acc0 = ""
14261426 func $f2_1 ($a,$i) = if (($i >= $s))
14271427 then $a
14281428 else permut($a, $l[$i])
14291429
14301430 func $f2_2 ($a,$i) = if (($i >= $s))
14311431 then $a
14321432 else throw("List size exceeds 25")
14331433
14341434 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
14351435 }
14361436
14371437
14381438 func getBackpack (bpKey) = {
14391439 let p = split(valueOrElse(getString(bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
14401440 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
14411441 then p[bpIdxRes]
14421442 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
14431443 then p[bpIdxMat]
14441444 else "0_0_0_0_0_0", p[bpIdxProd]]
14451445 }
14461446
14471447
14481448 func getWarehouseTotalVolume (volPrefix) = {
14491449 let parts = split(volPrefix, "_")
14501450 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
14511451 }
14521452
14531453
14541454 func getWarehouseOccupiedVol (currentWh) = {
14551455 let goods = currentWh[whIdxProd]
14561456 func sumResMat (acc,item) = (acc + parseIntValue(item))
14571457
14581458 func sumProd (acc,item) = {
14591459 let idx = acc._1
14601460 let pkgs = (((parseIntValue(item) + PRODUCTPKGSIZE) - 1) / PRODUCTPKGSIZE)
14611461 $Tuple2((idx + 1), (acc._2 + (pkgs * MULT8)))
14621462 }
14631463
14641464 let whResVol = {
14651465 let $l = split(currentWh[whIdxRes], "_")
14661466 let $s = size($l)
14671467 let $acc0 = 0
14681468 func $f0_1 ($a,$i) = if (($i >= $s))
14691469 then $a
14701470 else sumResMat($a, $l[$i])
14711471
14721472 func $f0_2 ($a,$i) = if (($i >= $s))
14731473 then $a
14741474 else throw("List size exceeds 6")
14751475
14761476 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14771477 }
14781478 let whMatVol = {
14791479 let $l = split(currentWh[whIdxMat], "_")
14801480 let $s = size($l)
14811481 let $acc0 = 0
14821482 func $f1_1 ($a,$i) = if (($i >= $s))
14831483 then $a
14841484 else sumResMat($a, $l[$i])
14851485
14861486 func $f1_2 ($a,$i) = if (($i >= $s))
14871487 then $a
14881488 else throw("List size exceeds 6")
14891489
14901490 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14911491 }
14921492 let whGoodsVol = if ((goods == ""))
14931493 then 0
14941494 else ( let $l = split_4C(goods, "_")
14951495 let $s = size($l)
14961496 let $acc0 = $Tuple2(0, 0)
14971497 func $f2_1 ($a,$i) = if (($i >= $s))
14981498 then $a
14991499 else sumProd($a, $l[$i])
15001500
15011501 func $f2_2 ($a,$i) = if (($i >= $s))
15021502 then $a
15031503 else throw("List size exceeds 50")
15041504
15051505 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._2
15061506 ((whResVol + whMatVol) + whGoodsVol)
15071507 }
15081508
15091509
15101510 func getWarehouse (whKey,landIndex,infraLevel) = {
15111511 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
15121512 let whTotal = getWarehouseTotalVolume(volPrefix)
15131513 let whStr = valueOrElse(getString(whKey), (volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0"))
15141514 let wh = split_4C(whStr, ":")
15151515 let whOccupied = getWarehouseOccupiedVol(wh)
15161516 let whLoft = if ((5 > size(wh)))
15171517 then makeString(["0", toString(whOccupied), toString((whTotal - whOccupied)), toString(whTotal)], "_")
15181518 else {
15191519 let loft = split(wh[whIdxLOFT], "_")
15201520 let whLocked = parseIntValue(loft[volLocked])
15211521 let occ = if ((size(loft) > 1))
15221522 then parseIntValue(loft[volOccupied])
15231523 else whOccupied
15241524 makeString([toString(whLocked), toString(occ), toString(((whTotal - whLocked) - occ)), toString(whTotal)], "_")
15251525 }
15261526 [wh[whIdxLevels], if ((size(split(wh[whIdxRes], "_")) == NUMRES))
15271527 then wh[whIdxRes]
15281528 else "0_0_0_0_0_0", if ((size(split(wh[whIdxMat], "_")) == NUMRES))
15291529 then wh[whIdxMat]
15301530 else "0_0_0_0_0_0", wh[whIdxProd], whLoft]
15311531 }
15321532
15331533
15341534 func getWarehouseSpaceLeft (currentWh) = {
15351535 let occupiedVol = getWarehouseOccupiedVol(currentWh)
15361536 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
15371537 ((getWarehouseTotalVolume(currentWh[whIdxLevels]) - occupiedVol) - currWhLockedVol)
15381538 }
15391539
15401540
15411541 func moveStuff (cargoParts,currentWh,currentPack) = if ((size(cargoParts) != 3))
15421542 then throw("cargoListStr should contain exactly 2 ':' separators")
15431543 else {
15441544 let resParts = split(cargoParts[0], "_")
15451545 let matParts = split(cargoParts[1], "_")
15461546 let prodParts = if ((cargoParts[2] == ""))
15471547 then nil
15481548 else split_4C(cargoParts[2], "_")
15491549 if ((size(resParts) != NUMRES))
15501550 then throw("All 6 resources should be passed")
15511551 else if ((size(matParts) != NUMRES))
15521552 then throw("All 6 materials should be passed")
15531553 else {
15541554 let whSpaceLeft = getWarehouseSpaceLeft(currentWh)
15551555 let currWhRes = split(currentWh[whIdxRes], "_")
15561556 let currWhMat = split(currentWh[whIdxMat], "_")
15571557 let currWhProd = if ((currentWh[whIdxProd] == ""))
15581558 then nil
15591559 else split_4C(currentWh[whIdxProd], "_")
15601560 let currentPackRes = split(currentPack[bpIdxRes], "_")
15611561 let currentPackMat = split(currentPack[bpIdxMat], "_")
15621562 let currentPackProd = if ((currentPack[bpIdxProd] == ""))
15631563 then nil
15641564 else split_4C(currentPack[bpIdxProd], "_")
15651565 func mvR (acc,item) = {
15661566 let i = acc._1
15671567 let am = parseIntValue(item)
15681568 let whr = parseIntValue(currWhRes[i])
15691569 let bpr = parseIntValue(currentPackRes[i])
15701570 if ((am == 0))
15711571 then $Tuple4((i + 1), (acc._2 :+ currWhRes[i]), (acc._3 :+ currentPackRes[i]), acc._4)
15721572 else if ((am > 0))
15731573 then if ((am > bpr))
15741574 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpr)) + " available"))
15751575 else $Tuple4((i + 1), (acc._2 :+ toString((whr + am))), (acc._3 :+ toString((bpr - am))), (acc._4 + am))
15761576 else if ((-(am) > whr))
15771577 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whr)) + " available"))
15781578 else $Tuple4((i + 1), (acc._2 :+ toString((whr + am))), (acc._3 :+ toString((bpr - am))), (acc._4 + am))
15791579 }
15801580
15811581 let r = {
15821582 let $l = resParts
15831583 let $s = size($l)
15841584 let $acc0 = $Tuple4(0, nil, nil, 0)
15851585 func $f0_1 ($a,$i) = if (($i >= $s))
15861586 then $a
15871587 else mvR($a, $l[$i])
15881588
15891589 func $f0_2 ($a,$i) = if (($i >= $s))
15901590 then $a
15911591 else throw("List size exceeds 6")
15921592
15931593 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
15941594 }
15951595 func mvM (acc,item) = {
15961596 let i = acc._1
15971597 let am = parseIntValue(item)
15981598 let whm = parseIntValue(currWhMat[i])
15991599 let bpm = parseIntValue(currentPackMat[i])
16001600 if ((am == 0))
16011601 then $Tuple4((i + 1), (acc._2 :+ currWhMat[i]), (acc._3 :+ currentPackMat[i]), acc._4)
16021602 else if ((am > 0))
16031603 then if ((am > bpm))
16041604 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpm)) + " available"))
16051605 else $Tuple4((i + 1), (acc._2 :+ toString((whm + am))), (acc._3 :+ toString((bpm - am))), (acc._4 + am))
16061606 else if ((-(am) > whm))
16071607 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whm)) + " available"))
16081608 else $Tuple4((i + 1), (acc._2 :+ toString((whm + am))), (acc._3 :+ toString((bpm - am))), (acc._4 + am))
16091609 }
16101610
16111611 let m = {
16121612 let $l = matParts
16131613 let $s = size($l)
16141614 let $acc0 = $Tuple4(0, nil, nil, r._4)
16151615 func $f1_1 ($a,$i) = if (($i >= $s))
16161616 then $a
16171617 else mvM($a, $l[$i])
16181618
16191619 func $f1_2 ($a,$i) = if (($i >= $s))
16201620 then $a
16211621 else throw("List size exceeds 6")
16221622
16231623 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
16241624 }
16251625 func mvP (acc,item) = {
16261626 let i = acc._1
16271627 let am = parseIntValue(item)
16281628 let whp = if ((size(currWhProd) > i))
16291629 then parseIntValue(currWhProd[i])
16301630 else 0
16311631 let bpp = if ((size(currentPackProd) > i))
16321632 then parseIntValue(currentPackProd[i])
16331633 else 0
16341634 if ((am == 0))
16351635 then $Tuple4((i + 1), (acc._2 :+ toString(whp)), (acc._3 :+ toString(bpp)), acc._4)
16361636 else if ((am > 0))
16371637 then if ((am > bpp))
16381638 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpp)) + " available"))
16391639 else {
16401640 let deltaVol = (toVolume((whp + am), PRODUCTPKGSIZE) - toVolume(whp, PRODUCTPKGSIZE))
16411641 $Tuple4((i + 1), (acc._2 :+ toString((whp + am))), (acc._3 :+ toString((bpp - am))), (acc._4 + deltaVol))
16421642 }
16431643 else if ((-(am) > whp))
16441644 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whp)) + " available"))
16451645 else {
16461646 let deltaVol = (toVolume((whp + am), PRODUCTPKGSIZE) - toVolume(whp, PRODUCTPKGSIZE))
16471647 $Tuple4((i + 1), (acc._2 :+ toString((whp + am))), (acc._3 :+ toString((bpp - am))), (acc._4 + deltaVol))
16481648 }
16491649 }
16501650
16511651 let p = if ((size(prodParts) != 0))
16521652 then {
16531653 let $l = prodParts
16541654 let $s = size($l)
16551655 let $acc0 = $Tuple4(0, nil, nil, m._4)
16561656 func $f2_1 ($a,$i) = if (($i >= $s))
16571657 then $a
16581658 else mvP($a, $l[$i])
16591659
16601660 func $f2_2 ($a,$i) = if (($i >= $s))
16611661 then $a
16621662 else throw("List size exceeds 50")
16631663
16641664 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
16651665 }
16661666 else $Tuple4(0, currWhProd, currentPackProd, m._4)
16671667 let volSaldo = p._4
16681668 if ((volSaldo > whSpaceLeft))
16691669 then throw((((("Attempt to put total " + toString(volSaldo)) + " stuff, but only ") + toString(whSpaceLeft)) + " warehouse space left"))
16701670 else $Tuple7(makeString(r._2, "_"), makeString(m._2, "_"), makeString_2C(p._2, "_"), makeString(r._3, "_"), makeString(m._3, "_"), makeString_2C(p._3, "_"), volSaldo)
16711671 }
16721672 }
16731673
16741674
16751675 func expeditionInternal (caller,txId) = {
16761676 let userAddr = toString(caller)
16771677 let bigNum = abs(toBigInt(txId))
16781678 let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), (PRESALENUMLANDS + 1))
16791679 let landNum = toString(freeNum)
16801680 let continentIdx = toInt((bigNum % FIVEX))
16811681 let terrains = genTerrains(bigNum, continentIdx)
16821682 let continent = continents[continentIdx]
16831683 let issue = Issue(nftName(landNum, "S"), makeString([landNum, "S", terrains, continent], "_"), 1, 0, false)
16841684 let assetId = calculateAssetId(issue)
16851685 let id = toBase58String(assetId)
16861686 $Tuple2([IntegerEntry(keyNextFreeLandNum(), (freeNum + 1)), issue, StringEntry(keyLandToAssetId(landNum), id), StringEntry(keyLandAssetIdToOwner(id), userAddr), StringEntry(keyLandNumToOwner(landNum), userAddr), IntegerEntry(keyInfraLevelByAssetId(id), 0), IntegerEntry(keyInfraLevelByAssetIdAndOwner(id, userAddr), 0), ScriptTransfer(caller, 1, assetId)], $Tuple2(id, continent))
16871687 }
16881688
16891689
16901690 func flightCommon (userAddr,message,sig) = if (!(sigVerify_8Kb(message, sig, pub)))
16911691 then throw("signature does not match")
16921692 else {
16931693 let parts = split_4C(toUtf8String(message), ";")
16941694 let flightLog = split_4C(parts[0], "|")
16951695 let hp = split(flightLog[flHealth], "_")
16961696 let curHP = parseIntValue(hp[0])
16971697 let newHP = parseIntValue(hp[1])
16981698 let newLocTxVer = split(parts[1], ":")
16991699 let newLocation = newLocTxVer[0]
17001700 let time = parseIntValue(flightLog[flTimestamp])
17011701 if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
17021702 then true
17031703 else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
17041704 then throw(((("signature outdated: logTime=" + toString(time)) + ", bcTime=") + toString(lastBlock.timestamp)))
17051705 else {
17061706 let txFromMsg = newLocTxVer[1]
17071707 let lastTx = valueOrElse(getString(keyLastTxIdByUser(userAddr)), "")
17081708 if ((lastTx != txFromMsg))
17091709 then throw(((("Tx ids don't match! In state: " + lastTx) + ", in msg: ") + txFromMsg))
17101710 else {
17111711 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
17121712 let keyHealth = keyDuckHealth(duckAssetId)
17131713 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
17141714 let oldFromState = valueOrElse(getInteger(keyHealth), maxHP)
17151715 if ((oldFromState != curHP))
17161716 then throw(((("oldHealth=" + toString(oldFromState)) + " from state does not match one from flight log=") + toString(curHP)))
17171717 else if ((0 >= curHP))
17181718 then throw("You can't fly with zero health")
17191719 else if (!(canWearCurrentEquipment(duckAssetId)))
17201720 then throw("Equipment incompatible")
17211721 else {
17221722 let bonus = if ((size(flightLog) > flBonus))
17231723 then flightLog[flBonus]
17241724 else ""
17251725 let prodUsed = if ((size(flightLog) > flProdsUsed))
17261726 then flightLog[flProdsUsed]
17271727 else ""
17281728 let sentAmount = if (if ((newHP > 0))
17291729 then (bonus == "$")
17301730 else false)
17311731 then asInt(invoke(restContract, "sendUsdtPrize", [userAddr], nil))
17321732 else 0
17331733 $Tuple5(newHP, duckAssetId, sentAmount, newLocation, prodUsed)
17341734 }
17351735 }
17361736 }
17371737 }
17381738
17391739
17401740 func applyBonuses (landAssetId,pieces) = {
17411741 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
17421742 let artPieces = valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
17431743 let add6 = (infraLevel / 6)
17441744 let add7 = (infraLevel / 7)
17451745 ((DAILYRESBYPIECE + fraction(DAILYRESBYPIECE, ((infraLevel + add6) + (2 * add7)), 5)) + fraction(DAILYRESBYPIECE, artPieces, (pieces * 5)))
17461746 }
17471747
17481748
17491749 func checkClaimConditions (addr,claimMode,landAssetIdIn) = {
17501750 let $t03373834277 = if ((claimMode == claimModeWh))
17511751 then $Tuple2(landAssetIdIn, valueOrElse(getString(keyStakedDuckByOwner(addr)), ""))
17521752 else {
17531753 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
17541754 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
17551755 let loc = split(value(curLocation), "_")
17561756 if ((loc[locIdxType] != "L"))
17571757 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
17581758 else $Tuple2(loc[locIdxId], duckAssetId)
17591759 }
17601760 let landAssetId = $t03373834277._1
17611761 let duckId = $t03373834277._2
17621762 let asset = value(assetInfo(fromBase58String(landAssetId)))
17631763 let timeKey = keyStakedTimeByAssetId(landAssetId)
17641764 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("Land " + asset.name) + " is not staked"))
17651765 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
17661766 if ((owner != addr))
17671767 then throw((LANDPREFIX + " is not yours"))
17681768 else {
17691769 let d = split(asset.description, "_")
17701770 $Tuple4(duckId, landAssetId, d, savedTime)
17711771 }
17721772 }
17731773
17741774
17751775 func claimResInternal (addr,amount,claimMode,landAssetIdIn) = if ((0 > amount))
17761776 then throw("Negative amount")
17771777 else {
17781778 let c = checkClaimConditions(addr, claimMode, landAssetIdIn)
17791779 let landSize = c._3[recLandSize]
17801780 let terrainCounts = countTerrains(c._3[recTerrains])
17811781 let deltaTime = (lastBlock.timestamp - c._4)
17821782 if ((0 > deltaTime))
17831783 then throw(((("Saved timestamp is in future, saved = " + toString(c._4)) + ", current = ") + toString(lastBlock.timestamp)))
17841784 else {
17851785 let pieces = numPiecesBySize(landSize)
17861786 let dailyProductionByPiece = applyBonuses(c._2, pieces)
17871787 let availRes = fraction(deltaTime, (dailyProductionByPiece * pieces), DAYMILLIS)
17881788 if ((amount > availRes))
17891789 then throw(((("Not enough resources, available = " + toString(availRes)) + ", requested = ") + toString(amount)))
17901790 else {
17911791 let newDeltaTime = fraction((availRes - amount), DAYMILLIS, (dailyProductionByPiece * pieces))
17921792 let newTimestamp = (lastBlock.timestamp - newDeltaTime)
17931793 let landIndex = (pieces / SSIZE)
17941794 let resToClaim = virtClaim(terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece)
17951795 let whKey = keyWarehouseByLand(c._2)
17961796 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(c._2)), 0)
17971797 let currentWh = getWarehouse(whKey, landIndex, infraLevel)
17981798 let loft = split(currentWh[whIdxLOFT], "_")
17991799 let whSpaceLeft = parseIntValue(loft[volFree])
18001800 if (if ((claimMode == claimModeWh))
18011801 then (amount > whSpaceLeft)
18021802 else false)
18031803 then throw((("Only " + toString(whSpaceLeft)) + " space left in warehouse"))
18041804 else {
18051805 let bpKey = keyBackpackByDuck(c._1)
18061806 let currentPack = getBackpack(bpKey)
18071807 let currentPackRes = split(currentPack[bpIdxRes], "_")
18081808 let currentWhRes = split(currentWh[whIdxRes], "_")
18091809 let $t03665137522 = if ((claimMode == claimModeWh))
18101810 then $Tuple4(addRes(currentWhRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), currentPack[bpIdxRes], (parseIntValue(loft[volOccupied]) + resToClaim._2), (parseIntValue(loft[volFree]) - resToClaim._2))
18111811 else if ((claimMode == claimModeDuck))
18121812 then $Tuple4(currentWh[whIdxRes], addRes(currentPackRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), parseIntValue(loft[volOccupied]), parseIntValue(loft[volFree]))
18131813 else {
18141814 let distr = distributeRes(currentWhRes, currentPackRes, resToClaim, whSpaceLeft)
18151815 let whAm = min([parseIntValue(loft[volFree]), resToClaim._2])
18161816 $Tuple4(distr._1, distr._2, (parseIntValue(loft[volOccupied]) + whAm), (parseIntValue(loft[volFree]) - whAm))
18171817 }
18181818 let whRes = $t03665137522._1
18191819 let bpRes = $t03665137522._2
18201820 let loftO = $t03665137522._3
18211821 let loftF = $t03665137522._4
18221822 $Tuple5([IntegerEntry(keyStakedTimeByAssetId(c._2), newTimestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, c._2, addr), newTimestamp)], bpKey, [currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], whKey, [currentWh[whIdxLevels], whRes, currentWh[whIdxMat], currentWh[whIdxProd], makeString([loft[volLocked], toString(loftO), toString(loftF), loft[volTotal]], "_")])
18231823 }
18241824 }
18251825 }
18261826 }
18271827
18281828
18291829 func claimAll (addr,landAssetId,pieces,claimMode) = {
18301830 let timeKey = keyStakedTimeByAssetId(landAssetId)
18311831 let savedTime = value(getInteger(timeKey))
18321832 let availRes = (fraction((lastBlock.timestamp - savedTime), applyBonuses(landAssetId, pieces), DAYMILLIS) * pieces)
18331833 claimResInternal(addr, availRes, claimMode, landAssetId)
18341834 }
18351835
18361836
18371837 func upInfraCommon (shouldUseMat,caller,paymentAmount,landAssetId) = {
18381838 let addr = toString(caller)
18391839 let c = checkClaimConditions(addr, claimModeWhThenDuck, landAssetId)
18401840 let pieces = numPiecesBySize(c._3[recLandSize])
18411841 let infraKey = keyInfraLevelByAssetId(c._2)
18421842 let curLevel = valueOrElse(getInteger(infraKey), 0)
18431843 if (if (!(KS_ALLOW_BIG_INFRA_MERGE))
18441844 then (curLevel >= 3)
18451845 else false)
18461846 then throw("Currently max infrastructure level = 3")
18471847 else {
18481848 let maxInfra = ((sqrt(pieces, 0, 0, DOWN) / 5) + 2)
18491849 let newLevel = (curLevel + 1)
18501850 if (if (KS_ALLOW_BIG_INFRA_MERGE)
18511851 then (newLevel > maxInfra)
18521852 else false)
18531853 then throw(("Currently max infrastructure level = " + toString(maxInfra)))
18541854 else {
18551855 let cost = fraction(InfraUpgradeCostSUsdt, (pieces * newLevel), SSIZE)
18561856 if (if (!(shouldUseMat))
18571857 then (paymentAmount != cost)
18581858 else false)
18591859 then throw(("Payment attached should be " + toString(cost)))
18601860 else {
18611861 let bpKey = keyBackpackByDuck(c._1)
18621862 let currentPack = getBackpack(bpKey)
18631863 let mList = split(currentPack[bpIdxMat], "_")
18641864 let matUsed = fraction(InfraUpgradeCostS, (pieces * newLevel), SSIZE)
18651865 let newMat = makeString(subtractMaterials(shouldUseMat, mList, matUsed), "_")
18661866 let claimResult = claimAll(addr, c._2, pieces, claimModeWhThenDuck)
18671867 let whData = claimResult._5
18681868 let oldVol = getWarehouseTotalVolume(whData[whIdxLevels])
18691869 let newVolData = makeString([split(whData[whIdxLevels], "_")[0], toString(newLevel)], "_")
18701870 let newVol = getWarehouseTotalVolume(newVolData)
18711871 let loft = split(whData[whIdxLOFT], "_")
18721872 let newLoftStr = makeString([loft[volLocked], loft[volOccupied], toString(((parseIntValue(loft[volFree]) + newVol) - oldVol)), toString(newVol)], "_")
18731873 $Tuple3(([IntegerEntry(infraKey, newLevel), IntegerEntry(keyInfraLevelByAssetIdAndOwner(c._2, addr), newLevel), StringEntry(bpKey, makeString([currentPack[bpIdxLevel], claimResult._3[bpIdxRes], newMat, currentPack[bpIdxProd]], ":")), StringEntry(claimResult._4, makeString([newVolData, whData[whIdxRes], whData[whIdxMat], whData[whIdxProd], newLoftStr], ":"))] ++ claimResult._1), newLevel, matUsed)
18741874 }
18751875 }
18761876 }
18771877 }
18781878
18791879
18801880 func updateDuckStatsInternal (duckAssetId,deltaXP) = {
18811881 let lvlKey = keyDuckLevel(duckAssetId)
18821882 let xpKey = keyDuckXP(duckAssetId)
18831883 let xp = valueOrElse(getInteger(xpKey), 0)
18841884 let newXP = (xp + deltaXP)
18851885 let lvlPoints = levelUp(valueOrElse(getInteger(lvlKey), 0), newXP)
18861886 let keyPoints = keyDuckFreePoints(duckAssetId)
18871887 $Tuple2([IntegerEntry(lvlKey, lvlPoints[0]), IntegerEntry(xpKey, newXP), IntegerEntry(keyPoints, (valueOrElse(getInteger(keyPoints), 0) + lvlPoints[1]))], newXP)
18881888 }
18891889
18901890
18911891 func updateAccStatsInternal (addr,deltaXP) = {
18921892 let lvlKey = keyUserLevel(addr)
18931893 let xpKey = keyUserXP(addr)
18941894 let xp = valueOrElse(getInteger(xpKey), 0)
18951895 let newXP = (xp + deltaXP)
18961896 let lvlPoints = levelUp(valueOrElse(getInteger(lvlKey), 0), newXP)
18971897 let keyPoints = keyUserFreePoints(addr)
18981898 $Tuple2([IntegerEntry(lvlKey, lvlPoints[0]), IntegerEntry(xpKey, newXP), IntegerEntry(keyPoints, (valueOrElse(getInteger(keyPoints), 0) + lvlPoints[1]))], newXP)
18991899 }
19001900
19011901
19021902 func activateOnboardArt (addr) = {
19031903 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
19041904 let refByKey = keyAddressRefBy(addr)
19051905 let refBy = getString(refByKey)
19061906 if (!(isDefined(refBy)))
19071907 then throw("You are not eligible for ONBOARD artifact")
19081908 else {
19091909 let artKey = keyOnboardArtDuckActivatedBy(addr)
19101910 let artDuck = getString(artKey)
19111911 if (isDefined(artDuck))
19121912 then throw(("You already used your ONBOARD artifact on duck " + value(artDuck)))
19131913 else {
19141914 let duckActivatorKey = keyOnboardArtActivatedOnDuck(duckAssetId)
19151915 let duckActivator = getString(duckActivatorKey)
19161916 if (isDefined(duckActivator))
19171917 then throw(((("The duck " + duckAssetId) + " already got points from ONBOARD artifact from user ") + value(duckActivator)))
19181918 else ([StringEntry(artKey, duckAssetId), StringEntry(duckActivatorKey, addr)] ++ updateDuckStatsInternal(duckAssetId, xpOnboard)._1)
19191919 }
19201920 }
19211921 }
19221922
19231923
19241924 func activatePresaleArt (addr,landAssetIdIn) = {
19251925 let c = checkClaimConditions(addr, claimModeWhThenDuck, landAssetIdIn)
19261926 let landAssetId = c._2
19271927 let pieces = numPiecesBySize(c._3[recLandSize])
19281928 let activationKey = keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)
19291929 if ((valueOrElse(getInteger(activationKey), 0) > 0))
19301930 then throw("Presale artifact is already activated")
19311931 else if ((parseIntValue(c._3[recLandNum]) > PRESALENUMLANDS))
19321932 then throw((((LANDPREFIX + " ") + landAssetId) + " is not eligible for presale artifact"))
19331933 else {
19341934 let claimResult = claimAll(addr, landAssetId, pieces, claimModeWhThenDuck)
19351935 (((claimResult._1 :+ IntegerEntry(activationKey, pieces)) :+ StringEntry(claimResult._2, makeString(claimResult._3, ":"))) :+ StringEntry(claimResult._4, makeString(claimResult._5, ":")))
19361936 }
19371937 }
19381938
19391939
19401940 func checkTournament (duckAssetId) = {
19411941 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
19421942 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
19431943 let now = lastBlock.timestamp
19441944 let tData = getTourData(tournamentContract, lastId)
19451945 let static = tData[idxStatic]
19461946 let dynamic = tData[idxDynamic]
19471947 if ((curLocation[locIdxType] != "T"))
19481948 then false
19491949 else if (if (if ((parseIntValue(curLocation[locIdxContinent]) == lastId))
19501950 then (dynamic[tDynamicStatus] == "INPROGRESS")
19511951 else false)
19521952 then (parseIntValue(static[tStaticEnd]) > now)
19531953 else false)
19541954 then throw("Your duck is taking part in the tournament")
19551955 else asBoolean(invoke(this, "exitTournamentInternal", [duckAssetId], nil))
19561956 }
19571957
19581958
19591959 func checkDelivery (duckAssetId) = if (!(KS_ALLOW_DELIVERY))
19601960 then false
19611961 else {
19621962 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
19631963 let now = lastBlock.timestamp
19641964 if ((curLocation[locIdxType] != "D"))
19651965 then false
19661966 else {
19671967 let startTime = parseIntValue(curLocation[locIdxContinent])
19681968 let distance = parseIntValue(curLocation[locIdxId])
19691969 if (if ((now > (startTime + TEN_MINUTES_MILLIS)))
19701970 then (3 > distance)
19711971 else false)
19721972 then throw("Your duck is on delivery mission")
19731973 else asBoolean(invoke(this, "exitDeliveryInternal", [duckAssetId], nil))
19741974 }
19751975 }
19761976
19771977
19781978 func exitDeliveryCommon (duckAssetId,check,newHP,score) = {
19791979 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
19801980 let now = lastBlock.timestamp
19811981 let startTime = parseIntValue(curLocation[locIdxContinent])
19821982 let distance = parseIntValue(curLocation[locIdxId])
19831983 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(duckAssetId)), "NFT duck is orphaned")
19841984 let healthKey = keyDuckHealth(duckAssetId)
19851985 let curHealth = getIntegerValue(healthKey)
19861986 let outcomeActions = if (if ((distance >= 3))
19871987 then true
1988- else if (check)
1988+ else if (if (check)
19891989 then (score >= 3)
1990+ else false)
1991+ then (newHP > 0)
19901992 else false)
19911993 then {
19921994 let reward = invoke(economyContract, "sendDeliveryReward", [owner], nil)
19931995 if ((reward == reward))
19941996 then nil
19951997 else throw("Strict value is not equal to itself.")
19961998 }
19971999 else if (if (if (check)
19982000 then (newHP > 0)
19992001 else false)
20002002 then ((startTime + TEN_MINUTES_MILLIS) > now)
20012003 else false)
20022004 then throw("Your duck is still on delivery mission")
20032005 else {
20042006 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
20052007 let unlock = invoke(economyContract, "updateDeliveryLocked", [(lockedTotal - MIN_USDT_FEE_DELIVERY)], nil)
20062008 if ((unlock == unlock))
2007- then if ((0 >= curHealth))
2009+ then if (if (if (check)
2010+ then (0 >= newHP)
2011+ else false)
2012+ then true
2013+ else (0 >= curHealth))
20082014 then nil
20092015 else [IntegerEntry(keyDeliveryDelayByDuck(duckAssetId), (startTime + DELIVERY_PUNISHMENT))]
20102016 else throw("Strict value is not equal to itself.")
20112017 }
20122018 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
20132019 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
20142020 $Tuple4(outcomeActions, [IntegerEntry(healthKey, savedHealth), StringEntry(keyDuckLocation(duckAssetId), savedLocation)], savedLocation, savedHealth)
20152021 }
20162022
20172023
20182024 func mergeInternal (newLandSize,newLevel,formula,addr,landAssetIds,needMat) = {
20192025 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
20202026 if (checkTournament(duckAssetId))
20212027 then throw("mergeInternal_checkTournament")
20222028 else if (checkDelivery(duckAssetId))
20232029 then throw("mergeInternal_checkDelivery")
20242030 else {
20252031 func checkMerge (acc,landAssetId) = {
20262032 let asset = value(assetInfo(fromBase58String(landAssetId)))
20272033 let timeKey = keyStakedTimeByAssetId(landAssetId)
20282034 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("NFT " + asset.name) + " is not staked"))
20292035 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
20302036 if ((owner != addr))
20312037 then throw((LANDPREFIX + " is not yours"))
20322038 else {
20332039 let d = split(asset.description, "_")
20342040 let continent = d[recContinent]
20352041 if (if ((acc._3 != ""))
20362042 then (acc._3 != continent)
20372043 else false)
20382044 then throw("Lands should be on the same continent to merge")
20392045 else {
20402046 let landSize = d[recLandSize]
20412047 let sizesIn = acc._1
20422048 let i = valueOrErrorMessage(indexOf(sizesIn, landSize), "You haven't passed all the lands needed")
20432049 let sizesOut = (take(sizesIn, i) + drop(sizesIn, (i + 1)))
20442050 let pieces = numPiecesBySize(landSize)
20452051 let arts = (acc._2 + valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0))
20462052 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
20472053 let reqLevel = match landSize {
20482054 case _ =>
20492055 if (("S" == $match0))
20502056 then 3
20512057 else if (("M" == $match0))
20522058 then 4
20532059 else if (("L" == $match0))
20542060 then 5
20552061 else if (("XL" == $match0))
20562062 then 6
20572063 else throw("Only S, M, L, XL can merge")
20582064 }
20592065 if ((infraLevel != reqLevel))
20602066 then throw("All lands should be maxed to merge")
20612067 else {
20622068 let landNum = d[recLandNum]
20632069 let terrainCounts = countTerrains(d[recTerrains])
20642070 let deltaTime = (lastBlock.timestamp - savedTime)
20652071 if ((0 > deltaTime))
20662072 then throw(((("Saved timestamp is in future, saved = " + toString(savedTime)) + ", current = ") + toString(lastBlock.timestamp)))
20672073 else {
20682074 let dailyProductionByPiece = applyBonuses(landAssetId, pieces)
20692075 let landIndex = (pieces / SSIZE)
20702076 let bpRes = addRes(split(acc._4, "_"), terrainCounts, deltaTime, landIndex, dailyProductionByPiece)
20712077 let props = updateProportionsInternal(acc._6, terrainCounts, landIndex, -1)
20722078 let cProps = updateProportionsInternal(acc._10, terrainCounts, landIndex, -1)
20732079 let sumTerrains = updateProportionsInternal(acc._9, terrainCounts, landIndex, 1)
20742080 let lands = acc._7
20752081 let idx = indexOf(lands, landAssetId)
20762082 if (!(isDefined(idx)))
20772083 then throw(("Your staked lands don't contain " + landAssetId))
20782084 else {
20792085 let customKey = keyLandAssetIdToCustomName(landAssetId)
20802086 let customName = valueOrElse(getString(customKey), "")
20812087 $Tuple10(sizesOut, arts, continent, bpRes, ((((((((((((acc._5 :+ DeleteEntry(keyStakedTimeByAssetId(landAssetId))) :+ DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, addr))) :+ DeleteEntry(keyLandToAssetId(landNum))) :+ DeleteEntry(keyLandAssetIdToOwner(landAssetId))) :+ DeleteEntry(keyInfraLevelByAssetId(landAssetId))) :+ DeleteEntry(keyInfraLevelByAssetIdAndOwner(landAssetId, addr))) :+ DeleteEntry(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId))) :+ DeleteEntry(keyLandNumToOwner(landNum))) :+ DeleteEntry(keyWarehouseByLand(landAssetId))) :+ DeleteEntry(customKey)) :+ Burn(fromBase58String(landAssetId), 1)) ++ (if ((customName != ""))
20822088 then [DeleteEntry(keyLandCustomNameToAssetId(customName))]
20832089 else nil)), props, removeByIndex(lands, value(idx)), (acc._8 + pieces), sumTerrains, cProps)
20842090 }
20852091 }
20862092 }
20872093 }
20882094 }
20892095 }
20902096
20912097 let bpKey = keyBackpackByDuck(duckAssetId)
20922098 let currentPack = getBackpack(bpKey)
20932099 let propList = split(valueOrElse(getString(keyResProportions()), "0_0_0_0_0_0"), "_")
20942100 let landsKey = keyStakedLandsByOwner(addr)
20952101 let landsStr = getString(landsKey)
20962102 let landsIn = if (isDefined(landsStr))
20972103 then split_51C(value(landsStr), "_")
20982104 else nil
20992105 let cont0 = split(value(assetInfo(fromBase58String(landAssetIds[0]))).description, "_")[recContinent]
21002106 let contProps = split(valueOrElse(getString(keyResTypesByContinent(cont0)), "0_0_0_0_0_0"), "_")
21012107 let r = {
21022108 let $l = landAssetIds
21032109 let $s = size($l)
21042110 let $acc0 = $Tuple10(formula, 0, "", currentPack[bpIdxRes], nil, propList, landsIn, 0, split("0_0_0_0_0_0", "_"), contProps)
21052111 func $f0_1 ($a,$i) = if (($i >= $s))
21062112 then $a
21072113 else checkMerge($a, $l[$i])
21082114
21092115 func $f0_2 ($a,$i) = if (($i >= $s))
21102116 then $a
21112117 else throw("List size exceeds 5")
21122118
21132119 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
21142120 }
21152121 let continent = r._3
21162122 let continentIdx = valueOrErrorMessage(indexOf(continents, continent), ("Unknown continent: " + continent))
21172123 let terrains = genTerrainsForMerge(r._9, (numPiecesBySize(newLandSize) / SSIZE))
21182124 let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), (PRESALENUMLANDS + 1))
21192125 let newLandNum = toString(freeNum)
21202126 let issue = Issue(nftName(newLandNum, newLandSize), makeString([newLandNum, newLandSize, terrains, continent], "_"), 1, 0, false)
21212127 let assetId = calculateAssetId(issue)
21222128 let newLandAssetId = toBase58String(assetId)
21232129 let newMat = makeString(subtractMaterials((needMat > 0), split(currentPack[bpIdxMat], "_"), needMat), "_")
21242130 let piecesKey = keyStakedPiecesByOwner(addr)
21252131 let stakedPieces = valueOrElse(getInteger(piecesKey), 0)
21262132 $Tuple2((((((((((((((((r._5 :+ (if ((size(r._7) > 0))
21272133 then StringEntry(landsKey, makeString_11C(r._7, "_"))
21282134 else DeleteEntry(landsKey))) :+ IntegerEntry(piecesKey, if ((r._8 > stakedPieces))
21292135 then 0
21302136 else (stakedPieces - r._8))) :+ IntegerEntry(keyNextFreeLandNum(), (freeNum + 1))) :+ issue) :+ StringEntry(keyLandToAssetId(newLandNum), newLandAssetId)) :+ StringEntry(keyLandAssetIdToOwner(newLandAssetId), addr)) :+ StringEntry(keyLandNumToOwner(newLandNum), addr)) :+ IntegerEntry(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, newLandAssetId), r._2)) :+ IntegerEntry(keyInfraLevelByAssetId(newLandAssetId), newLevel)) :+ IntegerEntry(keyInfraLevelByAssetIdAndOwner(newLandAssetId, addr), newLevel)) :+ StringEntry(bpKey, makeString([currentPack[bpIdxLevel], r._4, newMat, currentPack[bpIdxProd]], ":"))) :+ StringEntry(keyResProportions(), makeString(r._6, "_"))) :+ StringEntry(keyResTypesByContinent(continent), makeString(r._10, "_"))) :+ StringEntry(keyDuckLocation(duckAssetId), makeString([continent, "L", newLandAssetId], "_"))) :+ ScriptTransfer(addressFromStringValue(addr), 1, assetId)), newLandAssetId)
21312137 }
21322138 }
21332139
21342140
21352141 func s2m (addr,landAssetIds) = mergeInternal("M", 3, "SSSS", addr, landAssetIds, 0)
21362142
21372143
21382144 func m2l (addr,landAssetIds) = mergeInternal("L", 4, "SMM", addr, landAssetIds, (InfraUpgradeCostS * 4))
21392145
21402146
21412147 func l2xl (addr,landAssetIds) = mergeInternal("XL", 5, "SSSML", addr, landAssetIds, (InfraUpgradeCostS * 47))
21422148
21432149
21442150 func xl2xxl (addr,landAssetIds) = mergeInternal("XXL", 6, "LXL", addr, landAssetIds, (InfraUpgradeCostS * 54))
21452151
21462152
21472153 func mergeCommon (addr,landAssetIds) = match size(landAssetIds) {
21482154 case _ =>
21492155 if ((4 == $match0))
21502156 then s2m(addr, landAssetIds)
21512157 else if ((3 == $match0))
21522158 then m2l(addr, landAssetIds)
21532159 else if ((5 == $match0))
21542160 then l2xl(addr, landAssetIds)
21552161 else if ((2 == $match0))
21562162 then xl2xxl(addr, landAssetIds)
21572163 else throw("Unknown merge")
21582164 }
21592165
21602166
21612167 func checkOutdatedDelivery (userAddr) = {
21622168 let duck = getString(keyStakedDuckByOwner(userAddr))
21632169 if (if (KS_ALLOW_DELIVERY)
21642170 then isDefined(duck)
21652171 else false)
21662172 then {
21672173 let duckAssetId = value(duck)
21682174 let locKey = keyDuckLocation(duckAssetId)
21692175 let loc = split(valueOrElse(getString(locKey), DEFAULTLOCATION), "_")
21702176 let startTime = parseIntValue(loc[locIdxContinent])
21712177 if (if ((loc[locIdxType] != "D"))
21722178 then true
21732179 else (lastBlock.timestamp > (startTime + TEN_MINUTES_MILLIS)))
21742180 then nil
21752181 else {
21762182 let healthKey = keyDuckHealth(duckAssetId)
21772183 if ((parseIntValue(loc[locIdxId]) >= 3))
21782184 then {
21792185 let reward = invoke(economyContract, "sendDeliveryReward", [userAddr], nil)
21802186 if ((reward == reward))
21812187 then nil
21822188 else throw("Strict value is not equal to itself.")
21832189 }
21842190 else (({
21852191 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
21862192 let unlock = invoke(economyContract, "updateDeliveryLocked", [(lockedTotal - MIN_USDT_FEE_DELIVERY)], nil)
21872193 if ((unlock == unlock))
21882194 then if ((0 >= getIntegerValue(healthKey)))
21892195 then nil
21902196 else {
21912197 let punishment = invoke(this, "saveInteger", [keyDeliveryDelayByDuck(duckAssetId), (startTime + DELIVERY_PUNISHMENT)], nil)
21922198 if ((punishment == punishment))
21932199 then nil
21942200 else throw("Strict value is not equal to itself.")
21952201 }
21962202 else throw("Strict value is not equal to itself.")
21972203 } :+ IntegerEntry(healthKey, getIntegerValue(keySavedHealth(duckAssetId)))) :+ StringEntry(locKey, getStringValue(keySavedLocation(duckAssetId))))
21982204 }
21992205 }
22002206 else nil
22012207 }
22022208
22032209
22042210 func prolog (i) = if (if ((i.originCaller != restContract))
22052211 then valueOrElse(getBoolean(keyBlocked()), false)
22062212 else false)
22072213 then throw("Contracts are under maintenance")
22082214 else {
22092215 let userAddr = toString(i.originCaller)
22102216 (checkOutdatedDelivery(userAddr) :+ StringEntry(keyLastTxIdByUser(userAddr), toBase58String(i.transactionId)))
22112217 }
22122218
22132219
22142220 func prologFlight (i) = if (if ((i.originCaller != restContract))
22152221 then valueOrElse(getBoolean(keyBlocked()), false)
22162222 else false)
22172223 then throw("Contracts are under maintenance")
22182224 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
22192225
22202226
22212227 @Callable(i)
22222228 func constructorV1 (restAddr) = if ((i.caller != this))
22232229 then throw("Permission denied")
22242230 else [StringEntry(keyRestAddress(), restAddr)]
22252231
22262232
22272233
22282234 @Callable(i)
22292235 func saveInteger (key,amount) = if ((i.caller != this))
22302236 then throw("saveInteger is not public method")
22312237 else [IntegerEntry(key, amount)]
22322238
22332239
22342240
22352241 @Callable(i)
22362242 func setBlocked (isBlocked) = if ((i.caller != this))
22372243 then throw("permission denied")
22382244 else [BooleanEntry(keyBlocked(), isBlocked)]
22392245
22402246
22412247
22422248 @Callable(i)
22432249 func stakeLand () = {
22442250 let prologActions = prolog(i)
22452251 if ((size(i.payments) != 1))
22462252 then throw("Exactly one payment required")
22472253 else {
22482254 let pmt = value(i.payments[0])
22492255 let assetId = value(pmt.assetId)
22502256 let address = toString(i.caller)
22512257 if ((pmt.amount != 1))
22522258 then throw((("NFT " + LANDPREFIX) + " token should be attached as payment"))
22532259 else {
22542260 let asset = value(assetInfo(assetId))
22552261 if ((asset.issuer != this))
22562262 then throw("Unknown issuer of token")
22572263 else if (!(contains(asset.name, LANDPREFIX)))
22582264 then throw((("Only NFT " + LANDPREFIX) + " tokens are accepted"))
22592265 else {
22602266 let landNumSize = drop(asset.name, 4)
22612267 let landNum = if (contains(landNumSize, "XXL"))
22622268 then dropRight(landNumSize, 3)
22632269 else if (contains(landNumSize, "XL"))
22642270 then dropRight(landNumSize, 2)
22652271 else dropRight(landNumSize, 1)
22662272 if (!(isDefined(parseInt(landNum))))
22672273 then throw(("Cannot parse land number from " + asset.name))
22682274 else {
22692275 let landAssetId = toBase58String(assetId)
22702276 let timeKey = keyStakedTimeByAssetId(landAssetId)
22712277 if (isDefined(getInteger(timeKey)))
22722278 then throw((("NFT " + asset.name) + " is already staked"))
22732279 else {
22742280 let d = split(asset.description, "_")
22752281 let terrainCounts = countTerrains(d[recTerrains])
22762282 let pieces = numPiecesBySize(d[recLandSize])
22772283 let landIndex = (pieces / SSIZE)
22782284 let props = updateProportions(terrainCounts, landIndex, 1)
22792285 let resByContKey = keyResTypesByContinent(d[recContinent])
22802286 let contProps = split(valueOrElse(getString(resByContKey), "0_0_0_0_0_0"), "_")
22812287 let updatedContProps = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, 1), "_")
22822288 let landsKey = keyStakedLandsByOwner(address)
22832289 let landsStr = getString(landsKey)
22842290 let lands = if (isDefined(landsStr))
22852291 then split_51C(value(landsStr), "_")
22862292 else nil
22872293 if (containsElement(lands, landAssetId))
22882294 then throw(("Your staked lands already contain " + landAssetId))
22892295 else if ((size(lands) >= MAX_LANDS_STAKED_BY_USER))
22902296 then throw((("Your already staked max (" + toString(MAX_LANDS_STAKED_BY_USER)) + ") lands"))
22912297 else {
22922298 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
22932299 let piecesKey = keyStakedPiecesByOwner(address)
22942300 let oldPieces = valueOrElse(getInteger(piecesKey), 0)
22952301 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
22962302 $Tuple2(([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, address), lastBlock.timestamp), StringEntry(landsKey, makeString_11C((lands :+ landAssetId), "_")), IntegerEntry(piecesKey, (oldPieces + pieces)), StringEntry(keyLandAssetIdToOwner(landAssetId), address), StringEntry(keyLandNumToOwner(landNum), address), IntegerEntry(keyInfraLevelByAssetIdAndOwner(landAssetId, address), infraLevel), StringEntry(keyResProportions(), props), StringEntry(resByContKey, updatedContProps)] ++ prologActions), wlgResult)
22972303 }
22982304 }
22992305 }
23002306 }
23012307 }
23022308 }
23032309 }
23042310
23052311
23062312
23072313 @Callable(i)
23082314 func unstakeLand (landAssetIdIn) = {
23092315 let prologActions = prolog(i)
23102316 if ((size(i.payments) != 0))
23112317 then throw("No payments required")
23122318 else {
23132319 let addr = toString(i.caller)
23142320 let c = checkClaimConditions(addr, claimModeDuck, landAssetIdIn)
23152321 let landAssetId = c._2
23162322 let d = c._3
23172323 let landsKey = keyStakedLandsByOwner(addr)
23182324 let terrainCounts = countTerrains(d[recTerrains])
23192325 let pieces = numPiecesBySize(d[recLandSize])
23202326 let landIndex = (pieces / SSIZE)
23212327 let props = updateProportions(terrainCounts, landIndex, -1)
23222328 let resByContKey = keyResTypesByContinent(d[recContinent])
23232329 let contProps = split(valueOrElse(getString(resByContKey), "0_0_0_0_0_0"), "_")
23242330 let updatedContProps = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, -1), "_")
23252331 let claimResult = claimAll(addr, landAssetId, pieces, claimModeDuck)
23262332 let lands = split_51C(valueOrElse(getString(landsKey), ""), "_")
23272333 let idx = indexOf(lands, landAssetId)
23282334 if (!(isDefined(idx)))
23292335 then throw(("Your staked lands don't contain " + landAssetId))
23302336 else {
23312337 let now = lastBlock.timestamp
23322338 let govReleaseTime = valueOrElse(getInteger(govContract, keyUserGwlReleaseTime(addr)), 0)
23332339 if ((govReleaseTime >= now))
23342340 then throw(("Your gWL are taking part in voting, cannot unstake until " + toString(govReleaseTime)))
23352341 else {
23362342 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastArbTimeByUser(addr)), 0) + arbitrageDelay)
23372343 if ((arbReleaseTime > now))
23382344 then throw(("Your staked lands took part in arbitrage, cannot unstake until " + toString(arbReleaseTime)))
23392345 else {
23402346 let piecesKey = keyStakedPiecesByOwner(addr)
23412347 let stakedPieces = valueOrElse(getInteger(piecesKey), 0)
23422348 let newPieces = if ((pieces > stakedPieces))
23432349 then 0
23442350 else (stakedPieces - pieces)
23452351 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [addr], nil)
23462352 $Tuple2(([ScriptTransfer(i.caller, 1, fromBase58String(landAssetId)), DeleteEntry(keyStakedTimeByAssetId(landAssetId)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, addr)), StringEntry(keyResProportions(), props), StringEntry(resByContKey, updatedContProps), StringEntry(claimResult._2, makeString(claimResult._3, ":")), if ((size(lands) > 1))
23472353 then StringEntry(landsKey, makeString_11C(removeByIndex(lands, value(idx)), "_"))
23482354 else DeleteEntry(landsKey), IntegerEntry(piecesKey, newPieces)] ++ prologActions), wlgResult)
23492355 }
23502356 }
23512357 }
23522358 }
23532359 }
23542360
23552361
23562362
23572363 @Callable(i)
23582364 func stakeDuck () = {
23592365 let prologActions = prolog(i)
23602366 if ((size(i.payments) != 1))
23612367 then throw("Exactly one payment required")
23622368 else {
23632369 let pmt = value(i.payments[0])
23642370 let assetId = value(pmt.assetId)
23652371 let address = toString(i.caller)
23662372 if ((pmt.amount != 1))
23672373 then throw((("NFT " + DUCKPREFIX) + " token should be attached as payment"))
23682374 else {
23692375 let asset = value(assetInfo(assetId))
23702376 if (if ((asset.issuer != incubatorAddr))
23712377 then (asset.issuer != breederAddr)
23722378 else false)
23732379 then throw((("Unknown issuer of " + DUCKPREFIX) + " token"))
23742380 else if (!(contains(asset.name, DUCKPREFIX)))
23752381 then throw((("Only NFT " + DUCKPREFIX) + " tokens are accepted"))
23762382 else {
23772383 let assetIdStr = toBase58String(assetId)
23782384 let timeKey = keyStakedTimeByAssetId(assetIdStr)
23792385 if (isDefined(getInteger(timeKey)))
23802386 then throw((("NFT " + asset.name) + " is already staked"))
23812387 else if (isDefined(getString(keyStakedDuckByOwner(address))))
23822388 then throw(("You already staked one duck: " + asset.name))
23832389 else {
23842390 let locKey = keyDuckLocation(assetIdStr)
23852391 let location = getString(locKey)
23862392 let bpKey = keyBackpackByDuck(assetIdStr)
23872393 let backpack = getString(bpKey)
23882394 let keyHealth = keyDuckHealth(assetIdStr)
23892395 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(assetIdStr)), 0))
23902396 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
23912397 ([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, toBase58String(assetId), address), lastBlock.timestamp), StringEntry(keyDuckIdToOwner(assetIdStr), address), StringEntry(keyStakedDuckByOwner(address), assetIdStr)] ++ (if (isDefined(location))
23922398 then nil
23932399 else ([StringEntry(locKey, DEFAULTLOCATION)] ++ (if (isDefined(backpack))
23942400 then nil
23952401 else (([StringEntry(bpKey, "0:0_0_0_0_0_0:0_0_0_0_0_0:")] :+ IntegerEntry(keyHealth, curHealth)) ++ prologActions)))))
23962402 }
23972403 }
23982404 }
23992405 }
24002406 }
24012407
24022408
24032409
24042410 @Callable(i)
24052411 func unstakeDuck (assetIdStr) = {
24062412 let prologActions = prolog(i)
24072413 if ((size(i.payments) != 0))
24082414 then throw("No payments required")
24092415 else {
24102416 let assetId = fromBase58String(assetIdStr)
24112417 let address = toString(i.caller)
24122418 let asset = value(assetInfo(assetId))
24132419 let timeKey = keyStakedTimeByAssetId(assetIdStr)
24142420 if (!(isDefined(getInteger(timeKey))))
24152421 then throw((("NFT " + asset.name) + " is not staked"))
24162422 else if (!(isDefined(getString(keyStakedDuckByOwner(address)))))
24172423 then throw((("The duck " + asset.name) + " is not staked"))
24182424 else {
24192425 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(assetIdStr)), (("NFT " + asset.name) + " is orphaned"))
24202426 if ((owner != address))
24212427 then throw("Staked NFT is not yours")
24222428 else if (checkTournament(assetIdStr))
24232429 then throw("unstakeDuck_checkTournament")
24242430 else if (checkDelivery(assetIdStr))
24252431 then throw("unstakeDuck_checkDelivery")
24262432 else {
24272433 let keyHealth = keyDuckHealth(assetIdStr)
24282434 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(assetIdStr)), 0))
24292435 let health = valueOrElse(getInteger(keyHealth), maxHP)
24302436 if ((maxHP > health))
24312437 then throw((("Please heal your duck to " + toString(maxHP)) + "hp before unstaking"))
24322438 else ([ScriptTransfer(i.caller, 1, assetId), DeleteEntry(timeKey), DeleteEntry(keyHealth), DeleteEntry(keyDuckLocation(assetIdStr)), DeleteEntry(keyDuckIdToOwner(assetIdStr)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, assetIdStr, address)), DeleteEntry(keyStakedDuckByOwner(address))] ++ prologActions)
24332439 }
24342440 }
24352441 }
24362442 }
24372443
24382444
24392445
24402446 @Callable(i)
24412447 func claimRes (amount,landAssetIdStr) = {
24422448 let prologActions = prolog(i)
24432449 if ((size(i.payments) != 0))
24442450 then throw("No payments required")
24452451 else {
24462452 let addr = toString(i.originCaller)
24472453 let result = claimResInternal(addr, amount, claimModeDuck, landAssetIdStr)
24482454 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
24492455 $Tuple2(((((result._1 ++ updateDuckStatsInternal(duckAssetId, fraction(xpClaim, amount, MULT8))._1) :+ StringEntry(result._2, makeString(result._3, ":"))) :+ StringEntry(result._4, makeString(result._5, ":"))) ++ prologActions), result._3[bpIdxRes])
24502456 }
24512457 }
24522458
24532459
24542460
24552461 @Callable(i)
24562462 func claimResToWH (amount,landAssetIdStr) = {
24572463 let prologActions = prolog(i)
24582464 if ((size(i.payments) != 0))
24592465 then throw("No payments required")
24602466 else {
24612467 let addr = toString(i.originCaller)
24622468 let result = claimResInternal(addr, amount, claimModeWh, landAssetIdStr)
24632469 $Tuple2(((((result._1 ++ updateAccStatsInternal(addr, fraction(xpClaim, amount, MULT8))._1) :+ StringEntry(result._2, makeString(result._3, ":"))) :+ StringEntry(result._4, makeString(result._5, ":"))) ++ prologActions), result._5[whIdxRes])
24642470 }
24652471 }
24662472
24672473
24682474
24692475 @Callable(i)
24702476 func flight (message,sig) = {
24712477 let prologActions = prologFlight(i)
24722478 if ((size(i.payments) != 0))
24732479 then throw("No payments required")
24742480 else {
24752481 let userAddr = toString(i.caller)
24762482 let f = flightCommon(userAddr, message, sig)
24772483 let newHP = f._1
24782484 let duckAssetId = f._2
24792485 let locKey = keyDuckLocation(duckAssetId)
24802486 let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
24812487 let newLocation = f._4
24822488 if ((newLocation == curLocation))
24832489 then throw("You can't fly to the same location")
24842490 else {
24852491 let newLoc = split(newLocation, "_")
24862492 let isTour = (newLoc[locIdxType] == "T")
24872493 let isDeliv = (newLoc[locIdxType] == "D")
24882494 let eqKey = keyDuckEquipment(duckAssetId)
24892495 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2490- let $t07033870435 = subtractEquipment(currentEq, f._5)
2491- let newEq = $t07033870435._1
2492- let shouldZeroBuffs = $t07033870435._2
2493- let $t07043873556 = if (!(onMission(tournamentContract, curLocation)))
2496+ let $t07037470471 = subtractEquipment(currentEq, f._5)
2497+ let newEq = $t07037470471._1
2498+ let shouldZeroBuffs = $t07037470471._2
2499+ let $t07047473592 = if (!(onMission(tournamentContract, curLocation)))
24942500 then if (!(isUsualLocation(newLocation)))
24952501 then cheatAttempt(curLocation, newLocation, 5)
24962502 else if ((newHP > 0))
24972503 then $Tuple2(newLocation, newHP)
24982504 else $Tuple2(curLocation, 0)
24992505 else if (isInTournament(tournamentContract, curLocation))
25002506 then if (!(isInTournament(tournamentContract, newLocation)))
25012507 then throw("Your duck is taking part in the tournament")
25022508 else {
25032509 let score = parseIntValue(newLoc[locIdxId])
25042510 let curLoc = split(curLocation, "_")
25052511 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
25062512 if ((score != (parseIntValue(curLoc[locIdxId]) + 1)))
25072513 then cheatAttempt(curLocation, newLocation, 7)
25082514 else if ((newHP > 0))
25092515 then {
25102516 let localBest = valueOrElse(getInteger(tournamentContract, keyBestResultByTourAndDuck(lastId, duckAssetId)), 0)
25112517 let updLocal = if ((score > localBest))
25122518 then invoke(tournamentContract, "saveDuckResult", [duckAssetId, score], nil)
25132519 else unit
25142520 if ((updLocal == updLocal))
25152521 then $Tuple2(newLocation, newHP)
25162522 else throw("Strict value is not equal to itself.")
25172523 }
25182524 else $Tuple2(curLocation, 0)
25192525 }
25202526 else if (!(isInDelivery(curLocation)))
25212527 then {
25222528 let locHealth = asStringIntTuple(invoke(this, "autoExitDelivery", [duckAssetId, newHP, if (isDeliv)
25232529 then "10"
25242530 else "11", 0], nil))
25252531 if ((locHealth == locHealth))
25262532 then if (isDeliv)
25272533 then locHealth
25282534 else if ((newHP > 0))
25292535 then $Tuple2(newLocation, newHP)
25302536 else $Tuple2(locHealth._1, 0)
25312537 else throw("Strict value is not equal to itself.")
25322538 }
25332539 else if (!(isDeliv))
25342540 then throw("Your duck is taking part in delivery")
25352541 else if (!(isInDelivery(newLocation)))
25362542 then cheatAttempt(curLocation, newLocation, 13)
25372543 else {
25382544 let score = parseIntValue(newLoc[locIdxId])
25392545 let curLoc = split(curLocation, "_")
25402546 if ((score != (parseIntValue(curLoc[locIdxId]) + 1)))
25412547 then cheatAttempt(curLocation, newLocation, 14)
25422548 else if (if ((newHP > 0))
25432549 then (3 > score)
25442550 else false)
25452551 then $Tuple2(newLocation, newHP)
25462552 else {
25472553 let locHealth = asStringIntTuple(invoke(this, "autoExitDelivery", [duckAssetId, newHP, "15-17", score], nil))
25482554 if ((locHealth == locHealth))
25492555 then locHealth
25502556 else throw("Strict value is not equal to itself.")
25512557 }
25522558 }
2553- let locToSave = $t07043873556._1
2554- let hpToSave = $t07043873556._2
2559+ let locToSave = $t07047473592._1
2560+ let hpToSave = $t07047473592._2
25552561 $Tuple2(((([StringEntry(locKey, locToSave), StringEntry(eqKey, newEq), IntegerEntry(keyDuckHealth(duckAssetId), hpToSave)] ++ prologActions) ++ (if (shouldZeroBuffs)
25562562 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
25572563 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
25582564 then xpSuccessFlight
25592565 else xpFailFlight)._1), f._3)
25602566 }
25612567 }
25622568 }
25632569
25642570
25652571
25662572 @Callable(i)
25672573 func heal (quantityL1,quantityL2,quantityL3) = {
25682574 let prologActions = prolog(i)
25692575 if (if (if ((0 > quantityL1))
25702576 then true
25712577 else (0 > quantityL2))
25722578 then true
25732579 else (0 > quantityL3))
25742580 then throw("Quantity cannot be negative")
25752581 else {
25762582 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
25772583 if (checkTournament(duckAssetId))
25782584 then throw("heal_checkTournament")
25792585 else if (checkDelivery(duckAssetId))
25802586 then throw("heal_checkDelivery")
25812587 else {
25822588 let qts = [quantityL1, quantityL2, quantityL3]
25832589 let keyHealth = keyDuckHealth(duckAssetId)
25842590 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
25852591 let oldHealth = valueOrElse(getInteger(keyHealth), maxHP)
25862592 if ((oldHealth >= maxHP))
25872593 then throw((("HP should be < " + toString(maxHP)) + " to heal"))
25882594 else {
25892595 let bpKey = keyBackpackByDuck(duckAssetId)
25902596 let currentPack = getBackpack(bpKey)
25912597 let prodList = if ((currentPack[bpIdxProd] == ""))
25922598 then nil
25932599 else split_4C(currentPack[bpIdxProd], "_")
25942600 func iterateProd (acc,recipe) = {
25952601 let n = acc._2
25962602 let x = if ((size(prodList) > n))
25972603 then parseIntValue(prodList[n])
25982604 else 0
25992605 if ((3 > n))
26002606 then {
26012607 let q = qts[n]
26022608 if ((q > x))
26032609 then throw(((("You have only " + toString(x)) + " of ") + prodTypes[n]))
26042610 else $Tuple3((acc._1 :+ toString((x - q))), (n + 1), (acc._3 + (parseIntValue(split(recipe, "_")[rIdxEffect]) * q)))
26052611 }
26062612 else $Tuple3((acc._1 :+ toString(x)), (n + 1), acc._3)
26072613 }
26082614
26092615 let result = {
26102616 let $l = productionMatrix
26112617 let $s = size($l)
26122618 let $acc0 = $Tuple3(nil, 0, 0)
26132619 func $f0_1 ($a,$i) = if (($i >= $s))
26142620 then $a
26152621 else iterateProd($a, $l[$i])
26162622
26172623 func $f0_2 ($a,$i) = if (($i >= $s))
26182624 then $a
26192625 else throw("List size exceeds 50")
26202626
26212627 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
26222628 }
26232629 let newHealth = min([maxHP, (oldHealth + result._3)])
26242630 $Tuple2((([IntegerEntry(keyHealth, newHealth), StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString(result._1, "_")], ":"))] ++ prologActions) ++ updateDuckStatsInternal(duckAssetId, (xpHeal * ((quantityL1 + quantityL2) + quantityL3)))._1), newHealth)
26252631 }
26262632 }
26272633 }
26282634 }
26292635
26302636
26312637
26322638 @Callable(i)
26332639 func healES () = {
26342640 let prologActions = prolog(i)
26352641 if ((size(i.payments) != 1))
26362642 then throw("Exactly one payment required")
26372643 else {
26382644 let pmt = value(i.payments[0])
26392645 if ((pmt.assetId != usdtAssetId))
26402646 then throw("Allowed USDT payment only!")
26412647 else {
26422648 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
26432649 if (checkTournament(duckAssetId))
26442650 then throw("healES_checkTournament")
26452651 else if (checkDelivery(duckAssetId))
26462652 then throw("healES_checkDelivery")
26472653 else {
26482654 let keyHealth = keyDuckHealth(duckAssetId)
26492655 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
26502656 let oldHealth = valueOrElse(getInteger(keyHealth), maxHP)
26512657 if ((oldHealth > 0))
26522658 then throw("HP should be 0 to call Emergency Service")
26532659 else {
26542660 let bpKey = keyBackpackByDuck(duckAssetId)
26552661 let currentPack = getBackpack(bpKey)
26562662 let prodList = if ((currentPack[bpIdxProd] == ""))
26572663 then nil
26582664 else split_4C(currentPack[bpIdxProd], "_")
26592665 let medKitAmount1 = if ((size(prodList) > 0))
26602666 then parseIntValue(prodList[0])
26612667 else 0
26622668 let medKitAmount2 = if ((size(prodList) > 1))
26632669 then parseIntValue(prodList[1])
26642670 else 0
26652671 let medKitAmount3 = if ((size(prodList) > 2))
26662672 then parseIntValue(prodList[2])
26672673 else 0
26682674 if (if (if ((medKitAmount1 > 0))
26692675 then true
26702676 else (medKitAmount2 > 0))
26712677 then true
26722678 else (medKitAmount3 > 0))
26732679 then throw("You have to use own Medical Kit")
26742680 else {
26752681 let existStr = getString(economyContract, keyEsWarehouse())
26762682 let existAmounts = if (isDefined(existStr))
26772683 then split_4C(value(existStr), "_")
26782684 else nil
26792685 let existAmount = if ((size(existAmounts) > 0))
26802686 then parseIntValue(existAmounts[0])
26812687 else 0
26822688 if ((0 >= existAmount))
26832689 then throw("There are no Medical Kits L1 at Emergency Service storage")
26842690 else {
26852691 let newHealth = (oldHealth + parseIntValue(split(productionMatrix[0], "_")[rIdxEffect]))
26862692 let newES = makeString([toString((existAmount - 1)), removeByIndex(existAmounts, 0)], "_")
26872693 let recipe = split(productionMatrix[0], "_")
26882694 let totalMat = getRecipeMaterials(recipe)
26892695 let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
26902696 if ((pmt.amount != sellPrice))
26912697 then throw(("Payment attached should be " + toString(sellPrice)))
26922698 else {
26932699 let result = asString(invoke(economyContract, "updateEsStorage", [newES], [AttachedPayment(usdtAssetId, sellPrice)]))
26942700 $Tuple2(((prologActions :+ IntegerEntry(keyHealth, newHealth)) ++ updateDuckStatsInternal(duckAssetId, xpCallES)._1), result)
26952701 }
26962702 }
26972703 }
26982704 }
26992705 }
27002706 }
27012707 }
27022708 }
27032709
27042710
27052711
27062712 @Callable(i)
27072713 func updateBackpack (duckAssetId,newPack) = if ((i.caller != economyContract))
27082714 then throw("permission denied")
27092715 else $Tuple2([StringEntry(keyBackpackByDuck(duckAssetId), newPack)], newPack)
27102716
27112717
27122718
27132719 @Callable(i)
27142720 func commitForRandom () = {
27152721 let prologActions = prolog(i)
27162722 let finishBlock = (height + randomDelay)
27172723 let addr = toString(i.caller)
27182724 $Tuple2(([IntegerEntry(keyCommit(addr), finishBlock)] ++ prologActions), finishBlock)
27192725 }
27202726
27212727
27222728
27232729 @Callable(i)
27242730 func buySLand () = {
27252731 let prologActions = prolog(i)
27262732 if ((size(i.payments) != 1))
27272733 then throw("Exactly one payment required")
27282734 else {
27292735 let pmt = value(i.payments[0])
27302736 if ((pmt.assetId != usdtAssetId))
27312737 then throw("Allowed USDT payment only!")
27322738 else if ((pmt.amount != EXPUSDT))
27332739 then throw(("Payment attached should be " + toString(EXPUSDT)))
27342740 else {
27352741 let result = expeditionInternal(i.caller, i.transactionId)
27362742 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], nil))
27372743 $Tuple2((((result._1 :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)) ++ updateAccStatsInternal(toString(i.caller), xpNewSLand)._1) ++ prologActions), $Tuple2(result._2._1, acresResult))
27382744 }
27392745 }
27402746 }
27412747
27422748
27432749
27442750 @Callable(i)
27452751 func expedition (message,sig) = {
27462752 let prologActions = prolog(i)
27472753 if ((size(i.payments) != 0))
27482754 then throw("No payments required")
27492755 else {
27502756 let userAddr = toString(i.caller)
27512757 let f = flightCommon(userAddr, message, sig)
27522758 let duckAssetId = f._2
27532759 let keyHealth = keyDuckHealth(duckAssetId)
27542760 let bpKey = keyBackpackByDuck(duckAssetId)
27552761 let currentPack = getBackpack(bpKey)
27562762 let mList = split(currentPack[bpIdxMat], "_")
27572763 let newMat = makeString(subtractMaterials(true, mList, EXPMATERIALS), "_")
27582764 let eqKey = keyDuckEquipment(duckAssetId)
27592765 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2760- let $t08099681093 = subtractEquipment(currentEq, f._5)
2761- let newEq = $t08099681093._1
2762- let shouldZeroBuffs = $t08099681093._2
2766+ let $t08103281129 = subtractEquipment(currentEq, f._5)
2767+ let newEq = $t08103281129._1
2768+ let shouldZeroBuffs = $t08103281129._2
27632769 let e = expeditionInternal(i.caller, i.transactionId)
27642770 let id = e._2._1
27652771 let result = if ((0 >= f._1))
27662772 then $Tuple3([IntegerEntry(keyHealth, 0), StringEntry(eqKey, newEq)], "", 0)
27672773 else $Tuple3((e._1 ++ (if (shouldZeroBuffs)
27682774 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
27692775 else ((((nil :+ StringEntry(keyDuckLocation(duckAssetId), makeString([e._2._2, "L", id], "_"))) :+ IntegerEntry(keyHealth, f._1)) :+ StringEntry(eqKey, newEq)) :+ StringEntry(bpKey, makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], newMat, currentPack[bpIdxProd]], ":"))))), id, f._3)
27702776 if (checkTournament(duckAssetId))
27712777 then throw("expedition_checkTournament")
27722778 else if (checkDelivery(duckAssetId))
27732779 then throw("expedition_checkDelivery")
27742780 else {
27752781 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], nil))
27762782 $Tuple2(((result._1 ++ updateDuckStatsInternal(duckAssetId, xpNewSLand)._1) ++ prologActions), $Tuple3(result._2, result._3, acresResult))
27772783 }
27782784 }
27792785 }
27802786
27812787
27822788
27832789 @Callable(i)
27842790 func buySLandForAcres () = {
27852791 let prologActions = prolog(i)
27862792 if ((size(i.payments) != 1))
27872793 then throw("exactly 1 payment must be attached")
27882794 else {
27892795 let pmt = i.payments[0]
27902796 let amt = pmt.amount
27912797 if (if (!(isDefined(pmt.assetId)))
27922798 then true
27932799 else (value(pmt.assetId) != acresAssetId))
27942800 then throw("ACRES payments only!")
27952801 else if ((amt != S_COST_ACRES))
27962802 then throw(("Payment attached should be " + toString(S_COST_ACRES)))
27972803 else {
27982804 let result = expeditionInternal(i.caller, i.transactionId)
27992805 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], [AttachedPayment(acresAssetId, amt)]))
28002806 $Tuple2(((result._1 ++ updateAccStatsInternal(toString(i.caller), xpNewSLand)._1) ++ prologActions), $Tuple2(result._2._1, acresResult))
28012807 }
28022808 }
28032809 }
28042810
28052811
28062812
28072813 @Callable(i)
28082814 func upgradeInfra (landAssetId) = {
28092815 let prologActions = prolog(i)
28102816 if ((size(i.payments) != 0))
28112817 then throw("No payments required")
28122818 else {
28132819 let result = upInfraCommon(true, i.caller, 0, landAssetId)
28142820 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
28152821 $Tuple2(((result._1 ++ prologActions) ++ updateDuckStatsInternal(duckAssetId, fraction(xpUpgradeInfra, result._3, MULT8))._1), result._2)
28162822 }
28172823 }
28182824
28192825
28202826
28212827 @Callable(i)
28222828 func activateArtifact (artName,landAssetIdOpt) = {
28232829 let prologActions = prolog(i)
28242830 if ((size(i.payments) != 0))
28252831 then throw("No payments required")
28262832 else {
28272833 let addr = toString(i.caller)
28282834 let result = match artName {
28292835 case _ =>
28302836 if (("PRESALE" == $match0))
28312837 then activatePresaleArt(addr, landAssetIdOpt)
28322838 else if (("ONBOARD" == $match0))
28332839 then activateOnboardArt(addr)
28342840 else throw("Unknown artifact")
28352841 }
28362842 (result ++ prologActions)
28372843 }
28382844 }
28392845
28402846
28412847
28422848 @Callable(i)
28432849 func mergeLands (landAssetIds) = {
28442850 let prologActions = prolog(i)
28452851 if ((size(i.payments) != 0))
28462852 then throw("No payments required")
28472853 else {
28482854 let result = mergeCommon(toString(i.caller), landAssetIds)
28492855 $Tuple2(((result._1 ++ prologActions) ++ updateAccStatsInternal(toString(i.caller), xpMerge)._1), result._2)
28502856 }
28512857 }
28522858
28532859
28542860
28552861 @Callable(i)
28562862 func cargoExchange (cargoListStr,landAssetId) = {
28572863 let prologActions = prolog(i)
28582864 if ((size(i.payments) != 0))
28592865 then throw("No payments required")
28602866 else {
28612867 let cargoParts = split_4C(cargoListStr, ":")
28622868 let addr = toString(i.originCaller)
28632869 let asset = value(assetInfo(fromBase58String(landAssetId)))
28642870 let timeKey = keyStakedTimeByAssetId(landAssetId)
28652871 if (!(isDefined(getInteger(timeKey))))
28662872 then throw((asset.name + " is not staked"))
28672873 else {
28682874 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
28692875 if ((owner != addr))
28702876 then throw((LANDPREFIX + " is not yours"))
28712877 else {
28722878 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
28732879 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
28742880 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
28752881 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
28762882 let loc = split(value(curLocation), "_")
28772883 if ((loc[locIdxType] != "L"))
28782884 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
28792885 else if ((loc[locIdxId] != landAssetId))
28802886 then throw(("Duck should be on the land " + landAssetId))
28812887 else {
28822888 let whKey = keyWarehouseByLand(landAssetId)
28832889 let currentWh = getWarehouse(whKey, landIndex, infraLevel)
28842890 let bpKey = keyBackpackByDuck(duckAssetId)
28852891 let currentPack = getBackpack(bpKey)
28862892 let result = moveStuff(cargoParts, currentWh, currentPack)
28872893 let loft = split(currentWh[whIdxLOFT], "_")
28882894 let loftO = (parseIntValue(loft[volOccupied]) + result._7)
28892895 let loftF = (parseIntValue(loft[volFree]) - result._7)
28902896 ([StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], result._4, result._5, result._6], ":")), StringEntry(whKey, makeString_2C([currentWh[whIdxLevels], result._1, result._2, result._3, makeString([loft[volLocked], toString(loftO), toString(loftF), loft[volTotal]], "_")], ":"))] ++ prologActions)
28912897 }
28922898 }
28932899 }
28942900 }
28952901 }
28962902
28972903
28982904
28992905 @Callable(i)
29002906 func saveWarehouse (whStr,landAssetId) = if ((i.caller != economyContract))
29012907 then throw("Access denied")
29022908 else {
29032909 let whKey = keyWarehouseByLand(landAssetId)
29042910 let wh = split_4C(whStr, ":")
29052911 if ((size(wh) != 5))
29062912 then throw("warehouse string should contain 4 ':' separators")
29072913 else {
29082914 let loftL = split(wh[whIdxLOFT], "_")[volLocked]
29092915 let loftO = getWarehouseOccupiedVol(wh)
29102916 let loftT = getWarehouseTotalVolume(wh[whIdxLevels])
29112917 let loftF = ((loftT - parseIntValue(loftL)) - loftO)
29122918 let newWhStr = makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], wh[whIdxProd], makeString([loftL, toString(loftO), toString(loftF), toString(loftT)], "_")], ":")
29132919 $Tuple2([StringEntry(whKey, newWhStr)], newWhStr)
29142920 }
29152921 }
29162922
29172923
29182924
29192925 @Callable(i)
29202926 func fixWarehouseFormat (landAssetId) = if ((i.caller != restContract))
29212927 then throw("Access denied")
29222928 else {
29232929 let whKey = keyWarehouseByLand(landAssetId)
29242930 let asset = value(assetInfo(fromBase58String(landAssetId)))
29252931 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
29262932 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
29272933 let wh = getWarehouse(whKey, landIndex, infraLevel)
29282934 let loftL = asInt(invoke(economyContract, "recalcLockedVolumeREADONLY", [landAssetId, wh], nil))
29292935 let loftO = getWarehouseOccupiedVol(wh)
29302936 let loftT = getWarehouseTotalVolume(wh[whIdxLevels])
29312937 let loftF = ((loftT - loftL) - loftO)
29322938 let newWhStr = makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], wh[whIdxProd], makeString([toString(loftL), toString(loftO), toString(loftF), toString(loftT)], "_")], ":")
29332939 $Tuple2([StringEntry(whKey, newWhStr)], newWhStr)
29342940 }
29352941
29362942
29372943
29382944 @Callable(i)
29392945 func fixContinentProportions (landAssetIds) = if ((i.caller != restContract))
29402946 then throw("Access denied")
29412947 else {
29422948 func getProps (acc,cont) = (acc :+ valueOrElse(getString(keyResTypesByContinent(cont)), "0_0_0_0_0_0"))
29432949
29442950 let p = {
29452951 let $l = continents
29462952 let $s = size($l)
29472953 let $acc0 = nil
29482954 func $f0_1 ($a,$i) = if (($i >= $s))
29492955 then $a
29502956 else getProps($a, $l[$i])
29512957
29522958 func $f0_2 ($a,$i) = if (($i >= $s))
29532959 then $a
29542960 else throw("List size exceeds 5")
29552961
29562962 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
29572963 }
29582964 func processor (acc,landAssetId) = {
29592965 let asset = value(assetInfo(fromBase58String(landAssetId)))
29602966 let d = split(asset.description, "_")
29612967 let landIndex = (numPiecesBySize(d[recLandSize]) / SSIZE)
29622968 let cont = d[recContinent]
29632969 let terrainCounts = countTerrains(d[recTerrains])
29642970 let continentIdx = value(indexOf(continents, cont))
29652971 let contProps = split(acc[continentIdx], "_")
29662972 let updated = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, 1), "_")
29672973 match cont {
29682974 case _ =>
29692975 if (("Americas" == $match0))
29702976 then [updated, acc[1], acc[2], acc[3], acc[4]]
29712977 else if (("Europe" == $match0))
29722978 then [acc[0], updated, acc[2], acc[3], acc[4]]
29732979 else if (("Asia" == $match0))
29742980 then [acc[0], acc[1], updated, acc[3], acc[4]]
29752981 else if (("Africa" == $match0))
29762982 then [acc[0], acc[1], acc[2], updated, acc[4]]
29772983 else if (("Oceania" == $match0))
29782984 then [acc[0], acc[1], acc[2], acc[3], updated]
29792985 else throw("wrong continent")
29802986 }
29812987 }
29822988
29832989 let r = {
29842990 let $l = landAssetIds
29852991 let $s = size($l)
29862992 let $acc0 = p
29872993 func $f1_1 ($a,$i) = if (($i >= $s))
29882994 then $a
29892995 else processor($a, $l[$i])
29902996
29912997 func $f1_2 ($a,$i) = if (($i >= $s))
29922998 then $a
29932999 else throw("List size exceeds 100")
29943000
29953001 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
29963002 }
29973003 $Tuple2([StringEntry(keyResTypesByContinent("Americas"), r[0]), StringEntry(keyResTypesByContinent("Europe"), r[1]), StringEntry(keyResTypesByContinent("Asia"), r[2]), StringEntry(keyResTypesByContinent("Africa"), r[3]), StringEntry(keyResTypesByContinent("Oceania"), r[4])], 0)
29983004 }
29993005
30003006
30013007
30023008 @Callable(i)
30033009 func fixStakedPieces (address) = if ((i.caller != restContract))
30043010 then throw("Access denied")
30053011 else {
30063012 let stakedPieces = if ((address == ""))
30073013 then 0
30083014 else {
30093015 let landsStr = getString(stakingContract, keyStakedLandsByOwner(address))
30103016 let lands = if (isDefined(landsStr))
30113017 then split_51C(value(landsStr), "_")
30123018 else nil
30133019 func oneLand (acc,landAssetId) = {
30143020 let asset = value(assetInfo(fromBase58String(landAssetId)))
30153021 let landSize = split(asset.description, "_")[recLandSize]
30163022 (acc + numPiecesBySize(landSize))
30173023 }
30183024
30193025 let $l = lands
30203026 let $s = size($l)
30213027 let $acc0 = 0
30223028 func $f0_1 ($a,$i) = if (($i >= $s))
30233029 then $a
30243030 else oneLand($a, $l[$i])
30253031
30263032 func $f0_2 ($a,$i) = if (($i >= $s))
30273033 then $a
30283034 else throw("List size exceeds 100")
30293035
30303036 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
30313037 }
30323038 $Tuple2([IntegerEntry(keyStakedPiecesByOwner(address), stakedPieces)], stakedPieces)
30333039 }
30343040
30353041
30363042
30373043 @Callable(i)
30383044 func setCustomName (assetId,customName,type) = {
30393045 let prologActions = prolog(i)
30403046 if ((size(i.payments) != 1))
30413047 then throw("Exactly one payment required")
30423048 else {
30433049 let pmt = value(i.payments[0])
30443050 if ((pmt.assetId != usdtAssetId))
30453051 then throw("Allowed USDT payment only!")
30463052 else if ((pmt.amount != RENAMINGCOST))
30473053 then throw(("Payment should be " + toString(RENAMINGCOST)))
30483054 else if (contains(customName, "__"))
30493055 then throw(("Name should not contain '__': " + customName))
30503056 else if ((size(customName) > MAXNAMELEN))
30513057 then throw(("Name too long, maxLength=" + toString(MAXNAMELEN)))
30523058 else {
30533059 let addr = toString(i.originCaller)
30543060 let actions = match type {
30553061 case _ =>
30563062 if (("ACCOUNT" == $match0))
30573063 then {
30583064 let reverseKey = keyCustomNameToAddress(customName)
30593065 let nameOwner = getString(reverseKey)
30603066 if (isDefined(nameOwner))
30613067 then throw(("Name already registered: " + customName))
30623068 else {
30633069 let addrToNameKey = keyAddressToCustomName(addr)
30643070 let oldName = getString(addrToNameKey)
30653071 let freeOld = if (isDefined(oldName))
30663072 then [DeleteEntry(keyCustomNameToAddress(value(oldName)))]
30673073 else nil
30683074 (((freeOld :+ StringEntry(addrToNameKey, customName)) :+ StringEntry(reverseKey, addr)) ++ updateAccStatsInternal(addr, xpCustomName)._1)
30693075 }
30703076 }
30713077 else if (("LAND" == $match0))
30723078 then {
30733079 let asset = value(assetInfo(fromBase58String(assetId)))
30743080 let timeKey = keyStakedTimeByAssetId(assetId)
30753081 if (!(isDefined(getInteger(timeKey))))
30763082 then throw((asset.name + " is not staked"))
30773083 else {
30783084 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(assetId)), (("NFT " + asset.name) + " is orphaned"))
30793085 if ((owner != addr))
30803086 then throw((LANDPREFIX + " is not yours"))
30813087 else {
30823088 let reverseKey = keyLandCustomNameToAssetId(customName)
30833089 let nameOwner = getString(reverseKey)
30843090 if (isDefined(nameOwner))
30853091 then throw(("Name already registered: " + customName))
30863092 else {
30873093 let assetToNameKey = keyLandAssetIdToCustomName(assetId)
30883094 let oldName = getString(assetToNameKey)
30893095 let freeOld = if (isDefined(oldName))
30903096 then [DeleteEntry(keyLandCustomNameToAssetId(value(oldName)))]
30913097 else nil
30923098 (((freeOld :+ StringEntry(assetToNameKey, customName)) :+ StringEntry(reverseKey, assetId)) ++ updateAccStatsInternal(addr, xpCustomName)._1)
30933099 }
30943100 }
30953101 }
30963102 }
30973103 else if (("DUCK" == $match0))
30983104 then {
30993105 let asset = value(assetInfo(fromBase58String(assetId)))
31003106 let timeKey = keyStakedTimeByAssetId(assetId)
31013107 if (if (!(isDefined(getInteger(timeKey))))
31023108 then true
31033109 else !(isDefined(getString(keyStakedDuckByOwner(addr)))))
31043110 then throw((asset.name + " is not staked"))
31053111 else {
31063112 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(assetId)), (("NFT " + asset.name) + " is orphaned"))
31073113 if ((owner != addr))
31083114 then throw((DUCKPREFIX + " is not yours"))
31093115 else {
31103116 let reverseKey = keyDuckCustomNameToAssetId(customName)
31113117 let nameOwner = getString(reverseKey)
31123118 if (isDefined(nameOwner))
31133119 then throw(("Name already registered: " + customName))
31143120 else {
31153121 let assetToNameKey = keyDuckAssetIdToCustomName(assetId)
31163122 let oldName = getString(assetToNameKey)
31173123 let freeOld = if (isDefined(oldName))
31183124 then [DeleteEntry(keyDuckCustomNameToAssetId(value(oldName)))]
31193125 else nil
31203126 (((freeOld :+ StringEntry(assetToNameKey, customName)) :+ StringEntry(reverseKey, assetId)) ++ updateDuckStatsInternal(assetId, xpCustomName)._1)
31213127 }
31223128 }
31233129 }
31243130 }
31253131 else throw("Unknown entity type")
31263132 }
31273133 $Tuple2(((actions :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)) ++ prologActions), 0)
31283134 }
31293135 }
31303136 }
31313137
31323138
31333139
31343140 @Callable(i)
31353141 func setReferrals (oldPlayer,newPlayer) = if ((i.callerPublicKey != pub))
31363142 then throw("Permission denied")
31373143 else {
31383144 let prologActions = prolog(i)
31393145 if ((size(i.payments) != 0))
31403146 then throw("No payments required")
31413147 else if (!(isDefined(addressFromString(oldPlayer))))
31423148 then throw(("Invalid address: " + oldPlayer))
31433149 else if (!(isDefined(addressFromString(newPlayer))))
31443150 then throw(("Invalid address: " + newPlayer))
31453151 else {
31463152 let oldsKey = keyOldies()
31473153 let olds = getString(oldsKey)
31483154 let oldies = if (isDefined(olds))
31493155 then split_4C(value(olds), "_")
31503156 else nil
31513157 if (containsElement(oldies, newPlayer))
31523158 then throw((newPlayer + " is not newbie (already has referrals)"))
31533159 else {
31543160 let refByKey = keyAddressRefBy(newPlayer)
31553161 let refBy = getString(refByKey)
31563162 if (if (isDefined(refBy))
31573163 then isDefined(addressFromString(value(refBy)))
31583164 else false)
31593165 then throw(((newPlayer + " already has refBy: ") + value(refBy)))
31603166 else {
31613167 let refsKey = keyAddressReferrals(oldPlayer)
31623168 let refs = getString(refsKey)
31633169 let refsArray = if (isDefined(refs))
31643170 then split_4C(value(refs), "_")
31653171 else nil
31663172 if (containsElement(refsArray, newPlayer))
31673173 then throw((((oldPlayer + " already contains ") + newPlayer) + " within referrals"))
31683174 else {
31693175 let newRefs = makeString_2C((refsArray :+ newPlayer), "_")
31703176 let newOlds = if (containsElement(oldies, oldPlayer))
31713177 then value(olds)
31723178 else makeString_2C((oldies :+ oldPlayer), "_")
31733179 $Tuple2(([StringEntry(refByKey, oldPlayer), StringEntry(refsKey, newRefs), StringEntry(oldsKey, newOlds)] ++ prologActions), 0)
31743180 }
31753181 }
31763182 }
31773183 }
31783184 }
31793185
31803186
31813187
31823188 @Callable(i)
31833189 func distributePoints (strength,accuracy,intellect,endurance,dexterity) = {
31843190 let prologActions = prolog(i)
31853191 if ((size(i.payments) != 0))
31863192 then throw("No payments required")
31873193 else {
31883194 let addr = toString(i.originCaller)
31893195 let virtWlgData = asAnyList(invoke(wlgContract, "checkWlgXpREADONLY", [addr], nil))
31903196 let virtWlgPoints = asInt(virtWlgData[1])
3191- let $t09647896868 = if ((0 >= virtWlgPoints))
3197+ let $t09651496904 = if ((0 >= virtWlgPoints))
31923198 then $Tuple2(0, nil)
31933199 else {
31943200 let deltaXP = asInt(invoke(wlgContract, "takeWlgXp", [addr], nil))
31953201 if ((deltaXP == deltaXP))
31963202 then $Tuple2(virtWlgPoints, [IntegerEntry(keyUserLevel(addr), asInt(virtWlgData[0])), IntegerEntry(keyUserXP(addr), asInt(virtWlgData[2]))])
31973203 else throw("Strict value is not equal to itself.")
31983204 }
3199- let wlgPoints = $t09647896868._1
3200- let wlgActions = $t09647896868._2
3205+ let wlgPoints = $t09651496904._1
3206+ let wlgActions = $t09651496904._2
32013207 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
32023208 let freeKeyAcc = keyUserFreePoints(addr)
32033209 let freePointsAcc = (valueOrElse(getInteger(freeKeyAcc), 0) + wlgPoints)
32043210 let freeKeyDuck = keyDuckFreePoints(duckAssetId)
32053211 let freePointsDuck = valueOrElse(getInteger(freeKeyDuck), 0)
32063212 let sumFree = (freePointsAcc + freePointsDuck)
32073213 let sumToDistribute = ((((strength + accuracy) + intellect) + endurance) + dexterity)
32083214 if ((sumToDistribute > sumFree))
32093215 then throw((("There are only " + toString(sumFree)) + " free points to distribute"))
32103216 else {
32113217 let charsKey = keyDuckChars(duckAssetId)
32123218 let chars = split(valueOrElse(getString(charsKey), "0_0_0_0_0"), "_")
32133219 let newAcc = (freePointsAcc - sumToDistribute)
32143220 $Tuple2((([IntegerEntry(freeKeyAcc, if ((0 > newAcc))
32153221 then 0
32163222 else newAcc), IntegerEntry(freeKeyDuck, if ((0 > newAcc))
32173223 then (freePointsDuck + newAcc)
32183224 else freePointsDuck), StringEntry(charsKey, makeString([toString((parseIntValue(chars[charStrength]) + strength)), toString((parseIntValue(chars[charAccuracy]) + accuracy)), toString((parseIntValue(chars[charIntellect]) + intellect)), toString((parseIntValue(chars[charEndurance]) + endurance)), toString((parseIntValue(chars[charDexterity]) + dexterity))], "_"))] ++ prologActions) ++ wlgActions), 0)
32193225 }
32203226 }
32213227 }
32223228
32233229
32243230
32253231 @Callable(i)
32263232 func splitByGlobalWeightsREADONLY (amount) = $Tuple2(nil, getNeededMaterials(amount))
32273233
32283234
32293235
32303236 @Callable(i)
32313237 func splitByGlobalAndLocalWeightsREADONLY (matAmount,resAmount,terrains) = {
32323238 let terrainCounts = countTerrains(terrains)
32333239 $Tuple2(nil, $Tuple2(getNeededMaterials(matAmount), distributeByWeights(resAmount, terrainCounts)))
32343240 }
32353241
32363242
32373243
32383244 @Callable(i)
32393245 func getBackpackREADONLY (duckAssetId) = $Tuple2(nil, makeString(getBackpack(keyBackpackByDuck(duckAssetId)), ":"))
32403246
32413247
32423248
32433249 @Callable(i)
32443250 func getWarehouseREADONLY (landAssetId) = {
32453251 let asset = value(assetInfo(fromBase58String(landAssetId)))
32463252 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
32473253 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
32483254 $Tuple2(nil, makeString_2C(getWarehouse(keyWarehouseByLand(landAssetId), landIndex, infraLevel), ":"))
32493255 }
32503256
32513257
32523258
32533259 @Callable(i)
32543260 func saveLastTx () = if (!(containsElement([wlgContract, economyContract, tournamentContract, acresContract], i.caller)))
32553261 then throw("Access denied")
32563262 else $Tuple2(prolog(i), 42)
32573263
32583264
32593265
32603266 @Callable(i)
32613267 func updateDuckStats (duckAssetId,deltaXP) = if ((i.caller != economyContract))
32623268 then throw("Access denied")
32633269 else updateDuckStatsInternal(duckAssetId, deltaXP)
32643270
32653271
32663272
32673273 @Callable(i)
32683274 func updateAccStats (addr,deltaXP) = if (!(containsElement([wlgContract, economyContract, acresContract], i.caller)))
32693275 then throw("Access denied")
32703276 else updateAccStatsInternal(addr, deltaXP)
32713277
32723278
32733279
32743280 @Callable(i)
32753281 func equipDuck (equipment) = {
32763282 let prologActions = prolog(i)
32773283 if ((size(i.payments) != 0))
32783284 then throw("No payments required")
32793285 else {
32803286 let addr = toString(i.originCaller)
32813287 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
32823288 if (checkTournament(duckAssetId))
32833289 then throw("equipDuck_checkTournament")
32843290 else if (checkDelivery(duckAssetId))
32853291 then throw("equipDuck_checkDelivery")
32863292 else {
32873293 let eqKey = keyDuckEquipment(duckAssetId)
32883294 let currentSegs = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
32893295 let bpKey = keyBackpackByDuck(duckAssetId)
32903296 let currentPack = getBackpack(bpKey)
32913297 let newEq = split(equipment, "_")
32923298 if ((size(newEq) != NUMSEGMENTS))
32933299 then throw("Wrong equipment string")
32943300 else {
32953301 let tempProdB = dressB(currentSegs, prodStrToBytes(currentPack[bpIdxProd]), true, nil)
32963302 let segBpAux = split(newEq[segBackpack], ";")[1]
32973303 let buffEffect = if ((segBpAux == ""))
32983304 then 0
32993305 else {
33003306 let aux0 = split(segBpAux, ",")[0]
33013307 if ((aux0 == ""))
33023308 then 0
33033309 else {
33043310 let idxCnt = split(aux0, ":")
33053311 let idx = idxCnt[0]
33063312 let cnt = idxCnt[1]
33073313 if (if (if (if (if ((idx == "06"))
33083314 then true
33093315 else (idx == "07"))
33103316 then true
33113317 else (idx == "08"))
33123318 then (cnt != "")
33133319 else false)
33143320 then (parseIntValue(cnt) > 0)
33153321 else false)
33163322 then parseIntValue(split(productionMatrix[parseIntValue(idx)], "_")[rIdxEffect])
33173323 else 0
33183324 }
33193325 }
33203326 let stats = getDuckStats(this, duckAssetId, buffEffect, true)
33213327 let newProdB = dressB(newEq, tempProdB, false, stats)
33223328 let newProdStr = bytesToProdStr(newProdB)
33233329 $Tuple2(([StringEntry(eqKey, equipment), StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], newProdStr], ":")), StringEntry(keyDuckBuffs(duckAssetId), makeString([toString(stats[7]), toString(stats[8]), toString(stats[9]), toString(stats[10]), toString(stats[11])], "_"))] ++ prologActions), 0)
33243330 }
33253331 }
33263332 }
33273333 }
33283334
33293335
33303336
33313337 @Callable(i)
33323338 func fortificateLand (landAssetId,plan) = {
33333339 let prologActions = prolog(i)
33343340 if ((size(i.payments) != 0))
33353341 then throw("No payments required")
33363342 else {
33373343 let addr = toString(i.originCaller)
33383344 let duckAssetId = valueOrElse(getString(keyStakedDuckByOwner(addr)), "")
33393345 let duckStats = getDuckStats(this, duckAssetId, 0, false)
33403346 let fortKey = keyFortificationsByLand(landAssetId)
33413347 let currentForts = split(valueOrElse(getString(fortKey), ":0_15:0_18:0"), "_")
33423348 let asset = value(assetInfo(fromBase58String(landAssetId)))
33433349 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
33443350 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
33453351 let whKey = keyWarehouseByLand(landAssetId)
33463352 let wh = getWarehouse(whKey, landIndex, infraLevel)
33473353 let curLoft = split(wh[whIdxLOFT], "_")
33483354 let curO = parseIntValue(curLoft[volOccupied])
33493355 let curF = parseIntValue(curLoft[volFree])
33503356 let newForts = split(plan, "_")
3351- let $t0103706103821 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3352- let tempProdB = $t0103706103821._1
3353- let tempO = $t0103706103821._2
3354- let tempF = $t0103706103821._3
3355- let $t0103824103920 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3356- let newProdB = $t0103824103920._1
3357- let newO = $t0103824103920._2
3358- let newF = $t0103824103920._3
3357+ let $t0103742103857 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3358+ let tempProdB = $t0103742103857._1
3359+ let tempO = $t0103742103857._2
3360+ let tempF = $t0103742103857._3
3361+ let $t0103860103956 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3362+ let newProdB = $t0103860103956._1
3363+ let newO = $t0103860103956._2
3364+ let newF = $t0103860103956._3
33593365 let newProdStr = bytesToProdStr(newProdB)
33603366 let newLoftStr = makeString([curLoft[volLocked], toString(newO), toString(newF), curLoft[volTotal]], "_")
33613367 $Tuple2(([StringEntry(fortKey, plan), StringEntry(whKey, makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], newProdStr, newLoftStr], ":"))] ++ prologActions), 0)
33623368 }
33633369 }
33643370
33653371
33663372
33673373 @Callable(i)
33683374 func initDuckTourAttempt (duckAssetId) = if ((i.caller != tournamentContract))
33693375 then throw("Access denied")
33703376 else {
33713377 let keyHealth = keyDuckHealth(duckAssetId)
33723378 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
33733379 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
33743380 let curLocKey = keyDuckLocation(duckAssetId)
33753381 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
33763382 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
33773383 let tourLocation = (toString(lastId) + "_T_0")
33783384 $Tuple2([IntegerEntry(keySavedHealth(duckAssetId), curHealth), IntegerEntry(keyHealth, maxHP), StringEntry(keySavedLocation(duckAssetId), curLocation), StringEntry(curLocKey, tourLocation)], tourLocation)
33793385 }
33803386
33813387
33823388
33833389 @Callable(i)
33843390 func breakAttempt () = {
33853391 let prologActions = prolog(i)
33863392 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
33873393 let curLocKey = keyDuckLocation(duckAssetId)
33883394 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
33893395 if ((split(curLocation, "_")[locIdxType] != "T"))
33903396 then throw("Your duck is not in the tournament")
33913397 else {
33923398 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
33933399 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
33943400 $Tuple2(((prologActions :+ IntegerEntry(keyDuckHealth(duckAssetId), savedHealth)) :+ StringEntry(curLocKey, savedLocation)), curLocation)
33953401 }
33963402 }
33973403
33983404
33993405
34003406 @Callable(i)
34013407 func exitTournamentInternal (duckAssetId) = if ((i.caller != this))
34023408 then throw("Access denied")
34033409 else {
34043410 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
34053411 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
34063412 $Tuple2([IntegerEntry(keyDuckHealth(duckAssetId), savedHealth), StringEntry(keyDuckLocation(duckAssetId), savedLocation)], false)
34073413 }
34083414
34093415
34103416
34113417 @Callable(i)
34123418 func exitDeliveryInternal (duckAssetId) = if ((i.caller != this))
34133419 then throw("Access denied")
34143420 else {
34153421 let e = exitDeliveryCommon(duckAssetId, false, 0, 0)
34163422 $Tuple2((e._1 ++ e._2), false)
34173423 }
34183424
34193425
34203426
34213427 @Callable(i)
34223428 func autoExitDelivery (duckAssetId,newHP,reason,score) = if ((i.caller != this))
34233429 then throw("Access denied")
34243430 else {
34253431 let e = exitDeliveryCommon(duckAssetId, true, newHP, score)
34263432 $Tuple2(e._1, $Tuple2(e._3, e._4))
34273433 }
34283434
34293435
34303436
34313437 @Callable(i)
34323438 func prepareRobbery (message,sig) = {
34333439 let prologActions = prolog(i)
34343440 if (!(sigVerify_8Kb(message, sig, pub)))
34353441 then throw("signature does not match")
34363442 else if ((size(i.payments) != 1))
34373443 then throw("exactly 1 payment must be attached")
34383444 else {
34393445 let pmt = i.payments[0]
34403446 let wlgAmt = pmt.amount
34413447 if (if (!(isDefined(pmt.assetId)))
34423448 then true
34433449 else (value(pmt.assetId) != wlgAssetId))
34443450 then throw("WLGOLD payments only!")
34453451 else {
34463452 let parts = split(toUtf8String(message), "|")
34473453 if ((size(parts) != 2))
34483454 then throw("Wrong message format")
34493455 else {
34503456 let duckAssetId = parts[0]
34513457 if (checkTournament(duckAssetId))
34523458 then throw("prepareRobbery_checkTournament")
34533459 else if (checkDelivery(duckAssetId))
34543460 then throw("prepareRobbery_checkDelivery")
34553461 else {
34563462 let robCost = getRobberyData(this, duckAssetId)._1
34573463 if ((robCost > wlgAmt))
34583464 then throw(((("Payment " + toString(wlgAmt)) + " < required ") + toString(robCost)))
34593465 else {
34603466 let candidates = split(parts[1], "_")
34613467 let now = lastBlock.timestamp
34623468 let duckState = valueOrElse(getInteger(keyDuckRobberyState(duckAssetId)), 0)
34633469 let lockedLand = valueOrElse(getString(keyLockedLandByDuck(duckAssetId)), "")
34643470 let landETA = valueOrElse(getInteger(keyLandCooldownETA(lockedLand)), 0)
34653471 if (if ((duckState != duckIdxFree))
34663472 then (landETA > now)
34673473 else false)
34683474 then throw(("You already started robbing, wait till " + toString(landETA)))
34693475 else {
34703476 func checker (acc,landAssetId) = {
34713477 let state = valueOrElse(getInteger(keyLandRobberyState(landAssetId)), 0)
34723478 let cooldownETA = valueOrElse(getInteger(keyLandCooldownETA(landAssetId)), 0)
34733479 if ((state > size(landRobCooldowns)))
34743480 then throw("Invalid state")
34753481 else if ((now > cooldownETA))
34763482 then {
34773483 let stakedTime = valueOrElse(getInteger(keyStakedTimeByAssetId(landAssetId)), 0)
34783484 if ((0 >= stakedTime))
34793485 then acc
34803486 else {
34813487 let a = value(assetInfo(fromBase58String(landAssetId)))
34823488 let d = split(a.description, "_")
34833489 let pieces = numPiecesBySize(d[recLandSize])
34843490 let productivity = applyBonuses(landAssetId, pieces)
34853491 let deltaTime = (now - stakedTime)
34863492 let availRes = fraction(deltaTime, (productivity * pieces), DAYMILLIS)
34873493 if ((MIN_RES_TO_ROB > availRes))
34883494 then acc
34893495 else (acc :+ landAssetId)
34903496 }
34913497 }
34923498 else acc
34933499 }
34943500
34953501 let filtered = {
34963502 let $l = candidates
34973503 let $s = size($l)
34983504 let $acc0 = nil
34993505 func $f0_1 ($a,$i) = if (($i >= $s))
35003506 then $a
35013507 else checker($a, $l[$i])
35023508
35033509 func $f0_2 ($a,$i) = if (($i >= $s))
35043510 then $a
35053511 else throw("List size exceeds 10")
35063512
35073513 $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)
35083514 }
35093515 if ((size(filtered) == 0))
35103516 then throw("No candidates for robbery")
35113517 else {
35123518 let rndIdx = getRandomNumber(size(filtered), height, (sig + i.transactionId))
35133519 let landAssetId = filtered[rndIdx]
35143520 $Tuple2(([IntegerEntry(keyLandRobberyState(landAssetId), robIdxLocked), IntegerEntry(keyLandCooldownETA(landAssetId), (now + landRobCooldowns[robIdxLocked])), IntegerEntry(keyDuckRobberyState(duckAssetId), duckIdxPreparing), StringEntry(keyLockedLandByDuck(duckAssetId), landAssetId)] ++ prologActions), landAssetId)
35153521 }
35163522 }
35173523 }
35183524 }
35193525 }
35203526 }
35213527 }
35223528 }
35233529
35243530
35253531
35263532 @Callable(i)
35273533 func robLand (message,sig) = {
35283534 let prologActions = prolog(i)
35293535 if (!(sigVerify_8Kb(message, sig, pub)))
35303536 then throw("signature does not match")
35313537 else {
35323538 let userAddr = toString(i.caller)
35333539 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
35343540 let now = lastBlock.timestamp
35353541 $Tuple2((prologActions :+ IntegerEntry(keyLastRobberyTimeByDuck(duckAssetId), now)), 0)
35363542 }
35373543 }
35383544
35393545
35403546
35413547 @Callable(i)
35423548 func acceptDelivery () = if (!(KS_ALLOW_DELIVERY))
35433549 then throw("Delivery feature is turned off!")
35443550 else {
35453551 let prologActions = prolog(i)
35463552 let userAddr = toString(i.caller)
35473553 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
35483554 let fundTotal = valueOrElse(getInteger(economyContract, deliveryFundKey), 0)
35493555 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
35503556 if ((MIN_USDT_FEE_DELIVERY > (fundTotal - lockedTotal)))
35513557 then throw(((("Delivery is not available, fund=" + fixedPoint(fundTotal, 6)) + ", locked=") + fixedPoint(lockedTotal, 6)))
35523558 else {
35533559 let now = lastBlock.timestamp
35543560 let delayETA = valueOrElse(getInteger(keyDeliveryDelayByDuck(duckAssetId)), 0)
35553561 if ((delayETA > now))
35563562 then throw(("Delivery is forbidden for your duck until " + toString(delayETA)))
35573563 else if (checkTournament(duckAssetId))
35583564 then throw("acceptDelivery_checkTournament")
35593565 else if (checkDelivery(duckAssetId))
35603566 then throw("acceptDelivery_checkDelivery")
35613567 else {
35623568 let newLockedTotal = asInt(invoke(economyContract, "updateDeliveryLocked", [(lockedTotal + MIN_USDT_FEE_DELIVERY)], nil))
35633569 let keyHealth = keyDuckHealth(duckAssetId)
35643570 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
35653571 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
35663572 let curLocKey = keyDuckLocation(duckAssetId)
35673573 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
35683574 let deliveryLocation = (toString(now) + "_D_0")
35693575 $Tuple2(([IntegerEntry(keySavedHealth(duckAssetId), curHealth), IntegerEntry(keyHealth, maxHP), StringEntry(keySavedLocation(duckAssetId), curLocation), StringEntry(curLocKey, deliveryLocation)] ++ prologActions), $Tuple2(deliveryLocation, newLockedTotal))
35703576 }
35713577 }
35723578 }
35733579
35743580

github/deemru/w8io/169f3d6 
280.86 ms