tx · AhVG8kwzYRqB6RqyBuKLEfNxUAKHwgkc32a3WGY9HuPf

3MzmtwPfLaYnd4tAFiYU4ninJeAkiSVz1xJ:  -0.01000000 Waves

2022.05.10 22:42 [2046011] smart account 3MzmtwPfLaYnd4tAFiYU4ninJeAkiSVz1xJ > SELF 0.00000000 Waves

{ "type": 13, "id": "AhVG8kwzYRqB6RqyBuKLEfNxUAKHwgkc32a3WGY9HuPf", "fee": 1000000, "feeAssetId": null, "timestamp": 1652211803301, "version": 2, "chainId": 84, "sender": "3MzmtwPfLaYnd4tAFiYU4ninJeAkiSVz1xJ", "senderPublicKey": "ADY7Vz8YDzUweyFXFw6XRCbTpyVW5zXQw99MDbar8e44", "proofs": [ "26sENmxAm9N9zHKf3eqX6341EQZynoEcwB9pe9RzNGwVCb9cT5DiABjzq75h4yfVC212cfGk4GWKDSqVm4ovWuJD" ], "script": "base64:AAIFAAAAAAAAAC0IAhIICgYBAQEBAQESBgoEAQEBARIFCgMBAQESABIDCgEBEgASAwoBCBIAEgAAAABDAAAAAAtvcmFfa19wcmljZQIAAAAFcHJpY2UAAAAADmtfcG9zaXRpb25TaXplAgAAAA5rX3Bvc2l0aW9uU2l6ZQAAAAAQa19wb3NpdGlvbk1hcmdpbgIAAAAQa19wb3NpdGlvbk1hcmdpbgAAAAAWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAIAAAAWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAAAAAAua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIAAAASa19wb3NpdGlvbkZyYWN0aW9uAAAAAA1rX2luaXRpYWxpemVkAgAAAA1rX2luaXRpYWxpemVkAAAAAA9rX2Z1bmRpbmdQZXJpb2QCAAAAD2tfZnVuZGluZ1BlcmlvZAAAAAARa19pbml0TWFyZ2luUmF0aW8CAAAAEWtfaW5pdE1hcmdpblJhdGlvAAAAABhrX21haW50ZW5hbmNlTWFyZ2luUmF0aW8CAAAAGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAAAAAVa19saXF1aWRhdGlvbkZlZVJhdGlvAgAAABVrX2xpcXVpZGF0aW9uRmVlUmF0aW8AAAAAIWtfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIAAAAXa19sYXRlc3RQcmVtaXVtRnJhY3Rpb24AAAAAEmtfbmV4dEZ1bmRpbmdCbG9jawIAAAAea19uZXh0RnVuZGluZ0Jsb2NrTWluVGltZXN0YW1wAAAAAA1rX2Z1bmRpbmdSYXRlAgAAAA1rX2Z1bmRpbmdSYXRlAAAAABRrX3F1b3V0ZUFzc2V0UmVzZXJ2ZQIAAAAUa19xdW91dGVBc3NldFJlc2VydmUAAAAAEmtfYmFzZUFzc2V0UmVzZXJ2ZQIAAAASa19iYXNlQXNzZXRSZXNlcnZlAAAAACFrX2Jhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2QCAAAAEGtfYmFzZUFzc2V0RGVsdGEAAAAAE2tfdG90YWxQb3NpdGlvblNpemUCAAAAE2tfdG90YWxQb3NpdGlvblNpemUAAAAAFGtfY3VtdWxhdGl2ZU5vdGlvbmFsAgAAABRrX2N1bXVsYXRpdmVOb3Rpb25hbAAAAAAXa19vcGVuSW50ZXJlc2V0Tm90aW9uYWwCAAAAF2tfb3BlbkludGVyZXNldE5vdGlvbmFsAAAAAA1BRE1JTl9BRERSRVNTCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUgbJpw5N5SWKlTELWNc10Tx3NVa8jMtgHAAAAAARVU0ROAQAAACD3dur394PKZdtuE+4CO89YKZWpwdGN8kvabNgdYoDI3gAAAAAMVVNETl9TVEFLSU5HCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU1RSI+hLarpHDNucd0rt6s3mn30OjjZimAAAAAAZPUkFDTEUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVSejY4Al5SfQ9KNGpQt9mxR9NCIt5FVwUMAAAAACERJUl9MT05HAAAAAAAAAAABAAAAAAlESVJfU0hPUlQAAAAAAAAAAAIAAAAAFkZVTkRJTkdfQkxPQ0tfSU5URVJWQUwAAAAAAAAAADwAAAAAB1NFQ09ORFMAAAAAAAAAA+gAAAAADERFQ0lNQUxfVU5JVAkAAGgAAAACAAAAAAAAAAABCQAAaAAAAAIJAABoAAAAAgkAAGgAAAACCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAACgAAAAAAAAAACgAAAAAAAAAACgAAAAAAAAAACgAAAAAAAAAACgAAAAAAAAAACgAAAAAHT05FX0RBWQkAAGgAAAACAAAAAAAAAVGABQAAAAxERUNJTUFMX1VOSVQBAAAABGRpdmQAAAACAAAAAl94AAAAAl95CQEAAAAIZnJhY3Rpb24AAAAEBQAAAAJfeAUAAAAMREVDSU1BTF9VTklUBQAAAAJfeQUAAAAISEFMRkVWRU4BAAAABG11bGQAAAACAAAAAl94AAAAAl95CQEAAAAIZnJhY3Rpb24AAAAEBQAAAAJfeAUAAAACX3kFAAAADERFQ0lNQUxfVU5JVAUAAAAISEFMRkVWRU4BAAAAA2FicwAAAAEAAAACX3gDCQAAZgAAAAIFAAAAAl94AAAAAAAAAAAABQAAAAJfeAkBAAAAAS0AAAABBQAAAAJfeAEAAAAOdG9Db21wb3NpdGVLZXkAAAACAAAABF9rZXkAAAAIX2FkZHJlc3MJAAEsAAAAAgkAASwAAAACBQAAAARfa2V5AgAAAAFfBQAAAAhfYWRkcmVzcwEAAAAWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwAAAAMAAAAMX21hcmdpblJhdGlvAAAAEF9iYXNlTWFyZ2luUmF0aW8AAAAUX2xhcmdlclRoYW5PckVxdWFsVG8EAAAAFHJlbWFpbmluZ01hcmdpblJhdGlvCQAAZQAAAAIFAAAADF9tYXJnaW5SYXRpbwUAAAAQX2Jhc2VNYXJnaW5SYXRpbwMDBQAAABRfbGFyZ2VyVGhhbk9yRXF1YWxUbwkAAGYAAAACAAAAAAAAAAAABQAAABRyZW1haW5pbmdNYXJnaW5SYXRpbwcJAAACAAAAAQIAAAAOSW52YWxpZCBtYXJnaW4DAwkBAAAAASEAAAABBQAAABRfbGFyZ2VyVGhhbk9yRXF1YWxUbwkAAGcAAAACBQAAABRyZW1haW5pbmdNYXJnaW5SYXRpbwAAAAAAAAAAAAcJAAACAAAAAQIAAAAOSW52YWxpZCBtYXJnaW4GAQAAAA9pbml0TWFyZ2luUmF0aW8AAAAACQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAARa19pbml0TWFyZ2luUmF0aW8CAAAAHG5vIHZhbHVlIGZvciBpbml0TWFyZ2luUmF0aW8BAAAAEnF1b3V0ZUFzc2V0UmVzZXJ2ZQAAAAAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABRrX3F1b3V0ZUFzc2V0UmVzZXJ2ZQIAAAAfbm8gdmFsdWUgZm9yIHF1b3V0ZUFzc2V0UmVzZXJ2ZQEAAAAQYmFzZUFzc2V0UmVzZXJ2ZQAAAAAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABJrX2Jhc2VBc3NldFJlc2VydmUCAAAAHW5vIHZhbHVlIGZvciBiYXNlQXNzZXRSZXNlcnZlAQAAAB9iYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAIWtfYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZAIAAAAsbm8gdmFsdWUgZm9yIGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2QBAAAAEXRvdGFsUG9zaXRpb25TaXplAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAE2tfdG90YWxQb3NpdGlvblNpemUCAAAAHm5vIHZhbHVlIGZvciB0b3RhbFBvc2l0aW9uU2l6ZQEAAAASY3VtdWxhdGl2ZU5vdGlvbmFsAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFGtfY3VtdWxhdGl2ZU5vdGlvbmFsAgAAAB9ubyB2YWx1ZSBmb3IgY3VtdWxhdGl2ZU5vdGlvbmFsAQAAAB9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAIWtfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIAAAAsbm8gdmFsdWUgZm9yIGxhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BAAAAFW9wZW5JbnRlcmVzZXROb3Rpb25hbAAAAAAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABdrX29wZW5JbnRlcmVzZXROb3Rpb25hbAIAAAAibm8gdmFsdWUgZm9yIG9wZW5JbnRlcmVzZXROb3Rpb25hbAEAAAAZbmV4dEZ1bmRpbmdCbG9ja1RpbWVzdGFtcAAAAAAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABJrX25leHRGdW5kaW5nQmxvY2sCAAAAJm5vIHZhbHVlIGZvciBuZXh0RnVuZGluZ0Jsb2NrVGltZXN0YW1wAQAAABBmdW5kaW5nUGVyaW9kUmF3AAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAD2tfZnVuZGluZ1BlcmlvZAIAAAAabm8gdmFsdWUgZm9yIGZ1bmRpbmdQZXJpb2QBAAAAFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAAAAAkAAGgAAAACCQEAAAAQZnVuZGluZ1BlcmlvZFJhdwAAAAAFAAAADERFQ0lNQUxfVU5JVAEAAAAUZnVuZGluZ1BlcmlvZFNlY29uZHMAAAAACQAAaAAAAAIJAQAAABBmdW5kaW5nUGVyaW9kUmF3AAAAAAUAAAAHU0VDT05EUwEAAAAWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAAAAAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABhrX21haW50ZW5hbmNlTWFyZ2luUmF0aW8CAAAAI25vIHZhbHVlIGZvciBtYWludGVuYW5jZU1hcmdpblJhdGlvAQAAABNsaXF1aWRhdGlvbkZlZVJhdGlvAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFWtfbGlxdWlkYXRpb25GZWVSYXRpbwIAAAAgbm8gdmFsdWUgZm9yIGxpcXVpZGF0aW9uRmVlUmF0aW8BAAAAC2dldFBvc2l0aW9uAAAAAQAAAAdpbnZlc29yBAAAAA9wb3NpdGlvblNpemVPcHQJAAQaAAAAAgUAAAAEdGhpcwkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAOa19wb3NpdGlvblNpemUFAAAAB2ludmVzb3IEAAAAByRtYXRjaDAFAAAAD3Bvc2l0aW9uU2l6ZU9wdAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAxwb3NpdGlvblNpemUFAAAAByRtYXRjaDAJAAUWAAAABAUAAAAMcG9zaXRpb25TaXplCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABBrX3Bvc2l0aW9uTWFyZ2luBQAAAAdpbnZlc29yCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQAAAAdpbnZlc29yCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAAC5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQAAAAdpbnZlc29yCQAFFgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAE3JlcXVpcmVPcGVuUG9zaXRpb24AAAABAAAAB190cmFkZXIEAAAACyR0MDQ3Nzk0OTM0CQEAAAALZ2V0UG9zaXRpb24AAAABBQAAAAdfdHJhZGVyBAAAAAxwb3NpdGlvblNpemUIBQAAAAskdDA0Nzc5NDkzNAAAAAJfMQQAAAAOcG9zaXRpb25NYXJnaW4IBQAAAAskdDA0Nzc5NDkzNAAAAAJfMgQAAAAUcG9zaXRpb25PcGVuTm90aW9uYWwIBQAAAAskdDA0Nzc5NDkzNAAAAAJfMwQAAAAscG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24IBQAAAAskdDA0Nzc5NDkzNAAAAAJfNAMJAAAAAAAAAgUAAAAMcG9zaXRpb25TaXplAAAAAAAAAAAACQAAAgAAAAECAAAAEE5vIG9wZW4gcG9zaXRpb24GAQAAAAtpbml0aWFsaXplZAAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAANa19pbml0aWFsaXplZAcBAAAADXVwZGF0ZVJlc2VydmUAAAADAAAABl9pc0FkZAAAABFfcXVvdGVBc3NldEFtb3VudAAAABBfYmFzZUFzc2V0QW1vdW50AwUAAAAGX2lzQWRkCQAFFwAAAAUJAABkAAAAAgkBAAAAEnF1b3V0ZUFzc2V0UmVzZXJ2ZQAAAAAFAAAAEV9xdW90ZUFzc2V0QW1vdW50CQAAZQAAAAIJAQAAABBiYXNlQXNzZXRSZXNlcnZlAAAAAAUAAAAQX2Jhc2VBc3NldEFtb3VudAkAAGUAAAACCQEAAAAfYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZAAAAAAFAAAAEF9iYXNlQXNzZXRBbW91bnQJAABkAAAAAgkBAAAAEXRvdGFsUG9zaXRpb25TaXplAAAAAAUAAAAQX2Jhc2VBc3NldEFtb3VudAkAAGQAAAACCQEAAAASY3VtdWxhdGl2ZU5vdGlvbmFsAAAAAAUAAAARX3F1b3RlQXNzZXRBbW91bnQJAAUXAAAABQkAAGUAAAACCQEAAAAScXVvdXRlQXNzZXRSZXNlcnZlAAAAAAUAAAARX3F1b3RlQXNzZXRBbW91bnQJAABkAAAAAgkBAAAAEGJhc2VBc3NldFJlc2VydmUAAAAABQAAABBfYmFzZUFzc2V0QW1vdW50CQAAZAAAAAIJAQAAAB9iYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kAAAAAAUAAAAQX2Jhc2VBc3NldEFtb3VudAkAAGUAAAACCQEAAAARdG90YWxQb3NpdGlvblNpemUAAAAABQAAABBfYmFzZUFzc2V0QW1vdW50CQAAZQAAAAIJAQAAABJjdW11bGF0aXZlTm90aW9uYWwAAAAABQAAABFfcXVvdGVBc3NldEFtb3VudAEAAAAJc3dhcElucHV0AAAAAgAAAAZfaXNBZGQAAAAQX3F1b3RlQXNzZXRBbW91bgQAAAATX3F1b3V0ZUFzc2V0UmVzZXJ2ZQkBAAAAEnF1b3V0ZUFzc2V0UmVzZXJ2ZQAAAAAEAAAAEV9iYXNlQXNzZXRSZXNlcnZlCQEAAAAQYmFzZUFzc2V0UmVzZXJ2ZQAAAAAEAAAAAWsJAQAAAARtdWxkAAAAAgUAAAATX3F1b3V0ZUFzc2V0UmVzZXJ2ZQUAAAARX2Jhc2VBc3NldFJlc2VydmUEAAAAF3F1b3V0ZUFzc2V0UmVzZXJ2ZUFmdGVyAwUAAAAGX2lzQWRkCQAAZAAAAAIFAAAAE19xdW91dGVBc3NldFJlc2VydmUFAAAAEF9xdW90ZUFzc2V0QW1vdW4JAABlAAAAAgUAAAATX3F1b3V0ZUFzc2V0UmVzZXJ2ZQUAAAAQX3F1b3RlQXNzZXRBbW91bgQAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCQEAAAAEZGl2ZAAAAAIFAAAAAWsFAAAAF3F1b3V0ZUFzc2V0UmVzZXJ2ZUFmdGVyBAAAABhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQAAAANhYnMAAAABCQAAZQAAAAIFAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcgUAAAARX2Jhc2VBc3NldFJlc2VydmUEAAAAFWFtb3VudEJhc2VBc3NldEJvdWdodAMFAAAABl9pc0FkZAUAAAAYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzCQEAAAABLQAAAAEFAAAAGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQAAAALJHQwNjQxMDY2NDYJAQAAAA11cGRhdGVSZXNlcnZlAAAAAwUAAAAGX2lzQWRkBQAAABBfcXVvdGVBc3NldEFtb3VuBQAAABhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEAAAAGHF1b3V0ZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFAAAACyR0MDY0MTA2NjQ2AAAAAl8xBAAAABZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUAAAALJHQwNjQxMDY2NDYAAAACXzIEAAAAJWJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcjEIBQAAAAskdDA2NDEwNjY0NgAAAAJfMwQAAAAXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQAAAAskdDA2NDEwNjY0NgAAAAJfNAQAAAAYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCAUAAAALJHQwNjQxMDY2NDYAAAACXzUJAAUYAAAABgUAAAAVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BQAAABhxdW91dGVBc3NldFJlc2VydmVBZnRlcjEFAAAAFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFAAAAJWJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcjEFAAAAF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxBQAAABhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEBAAAAImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQAAAAEAAAAEF9vbGRQb3NpdGlvblNpemUAAAASX29sZFBvc2l0aW9uTWFyZ2luAAAAMF9vbGRQb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAAAAxfbWFyZ2luRGVsdGEEAAAAIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQEAAAAfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAAAAAEAAAADmZ1bmRpbmdQYXltZW50AwkBAAAAAiE9AAAAAgUAAAAQX29sZFBvc2l0aW9uU2l6ZQAAAAAAAAAAAAkBAAAABG11bGQAAAACCQAAZQAAAAIFAAAAIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQAAADBfb2xkUG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FAAAAEF9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAEAAAADHNpZ25lZE1hcmdpbgkAAGQAAAACCQAAZQAAAAIFAAAADF9tYXJnaW5EZWx0YQUAAAAOZnVuZGluZ1BheW1lbnQFAAAAEl9vbGRQb3NpdGlvbk1hcmdpbgQAAAALJHQwNzM3ODc1MDUDCQAAZgAAAAIAAAAAAAAAAAAFAAAADHNpZ25lZE1hcmdpbgkABRQAAAACAAAAAAAAAAAACQEAAAADYWJzAAAAAQUAAAAMc2lnbmVkTWFyZ2luCQAFFAAAAAIJAQAAAANhYnMAAAABBQAAAAxzaWduZWRNYXJnaW4AAAAAAAAAAAAEAAAADHJlbWFpbk1hcmdpbggFAAAACyR0MDczNzg3NTA1AAAAAl8xBAAAAAdiYWREZWJ0CAUAAAALJHQwNzM3ODc1MDUAAAACXzIJAAUWAAAABAUAAAAMcmVtYWluTWFyZ2luBQAAAAdiYWREZWJ0BQAAAA5mdW5kaW5nUGF5bWVudAUAAAAgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BAAAAGmdldE91dHB1dFByaWNlV2l0aFJlc2VydmVzAAAABAAAAARfYWRkAAAAEF9iYXNlQXNzZXRBbW91bnQAAAAVX3F1b3RlQXNzZXRQb29sQW1vdW50AAAAFF9iYXNlQXNzZXRQb29sQW1vdW50AwkAAAAAAAACBQAAABBfYmFzZUFzc2V0QW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAGUludmFsaWQgYmFzZSBhc3NldCBhbW91bnQEAAAAAWsJAQAAAARtdWxkAAAAAgUAAAAVX3F1b3RlQXNzZXRQb29sQW1vdW50BQAAABRfYmFzZUFzc2V0UG9vbEFtb3VudAQAAAAYYmFzZUFzc2V0UG9vbEFtb3VudEFmdGVyAwUAAAAEX2FkZAkAAGQAAAACBQAAABRfYmFzZUFzc2V0UG9vbEFtb3VudAUAAAAQX2Jhc2VBc3NldEFtb3VudAkAAGUAAAACBQAAABRfYmFzZUFzc2V0UG9vbEFtb3VudAUAAAAQX2Jhc2VBc3NldEFtb3VudAQAAAAPcXVvdGVBc3NldEFmdGVyCQEAAAAEZGl2ZAAAAAIFAAAAAWsFAAAAGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgQAAAAOcXVvdGVBc3NldFNvbGQJAQAAAANhYnMAAAABCQAAZQAAAAIFAAAAD3F1b3RlQXNzZXRBZnRlcgUAAAAVX3F1b3RlQXNzZXRQb29sQW1vdW50BAAAAAskdDA4MTc2ODQxMwkBAAAADXVwZGF0ZVJlc2VydmUAAAADCQEAAAABIQAAAAEFAAAABF9hZGQFAAAADnF1b3RlQXNzZXRTb2xkBQAAABBfYmFzZUFzc2V0QW1vdW50BAAAABhxdW91dGVBc3NldFJlc2VydmVBZnRlcjEIBQAAAAskdDA4MTc2ODQxMwAAAAJfMQQAAAAWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFAAAACyR0MDgxNzY4NDEzAAAAAl8yBAAAACViYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIxCAUAAAALJHQwODE3Njg0MTMAAAACXzMEAAAAF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUAAAALJHQwODE3Njg0MTMAAAACXzQEAAAAGGN1bXVsYXRpdmVOb3Rpb25hbEFmdGVyMQgFAAAACyR0MDgxNzY4NDEzAAAAAl81CQAFGAAAAAYFAAAADnF1b3RlQXNzZXRTb2xkBQAAABhxdW91dGVBc3NldFJlc2VydmVBZnRlcjEFAAAAFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFAAAAJWJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcjEFAAAAF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxBQAAABhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEBAAAAI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAAAAAQAAAAdfdHJhZGVyBAAAAAskdDA4Njg5ODg0NAkBAAAAC2dldFBvc2l0aW9uAAAAAQUAAAAHX3RyYWRlcgQAAAAMcG9zaXRpb25TaXplCAUAAAALJHQwODY4OTg4NDQAAAACXzEEAAAADnBvc2l0aW9uTWFyZ2luCAUAAAALJHQwODY4OTg4NDQAAAACXzIEAAAAFHBvc2l0aW9uT3Blbk5vdGlvbmFsCAUAAAALJHQwODY4OTg4NDQAAAACXzMEAAAALHBvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCAUAAAALJHQwODY4OTg4NDQAAAACXzQEAAAAD3Bvc2l0aW9uU2l6ZUFicwkBAAAAA2FicwAAAAEFAAAADHBvc2l0aW9uU2l6ZQMJAAAAAAAAAgUAAAAPcG9zaXRpb25TaXplQWJzAAAAAAAAAAAACQAAAgAAAAECAAAAFUludmFsaWQgcG9zaXRpb24gc2l6ZQQAAAAHaXNTaG9ydAkAAGYAAAACAAAAAAAAAAAABQAAAAxwb3NpdGlvblNpemUEAAAACyR0MDkwMjE5MTkzCQEAAAAaZ2V0T3V0cHV0UHJpY2VXaXRoUmVzZXJ2ZXMAAAAECQEAAAABIQAAAAEFAAAAB2lzU2hvcnQFAAAAD3Bvc2l0aW9uU2l6ZUFicwkBAAAAEnF1b3V0ZUFzc2V0UmVzZXJ2ZQAAAAAJAQAAABBiYXNlQXNzZXRSZXNlcnZlAAAAAAQAAAAQcG9zaXRpb25Ob3Rpb25hbAgFAAAACyR0MDkwMjE5MTkzAAAAAl8xBAAAAAJ4MQgFAAAACyR0MDkwMjE5MTkzAAAAAl8yBAAAAAJ4MggFAAAACyR0MDkwMjE5MTkzAAAAAl8zBAAAAAJ4MwgFAAAACyR0MDkwMjE5MTkzAAAAAl80BAAAAA11bnJlYWxpemVkUG5sAwUAAAAHaXNTaG9ydAkAAGUAAAACBQAAABRwb3NpdGlvbk9wZW5Ob3Rpb25hbAUAAAAQcG9zaXRpb25Ob3Rpb25hbAkAAGUAAAACBQAAABBwb3NpdGlvbk5vdGlvbmFsBQAAABRwb3NpdGlvbk9wZW5Ob3Rpb25hbAkABRQAAAACBQAAABBwb3NpdGlvbk5vdGlvbmFsBQAAAA11bnJlYWxpemVkUG5sAQAAABJnZXRPcmFjbGVUd2FwUHJpY2UAAAAACQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAZPUkFDTEUFAAAAC29yYV9rX3ByaWNlAQAAABBnZXRUd2FwU3BvdFByaWNlAAAAAAkBAAAABGRpdmQAAAACCQEAAAAScXVvdXRlQXNzZXRSZXNlcnZlAAAAAAkBAAAAEGJhc2VBc3NldFJlc2VydmUAAAAAAQAAAA5nZXRNYXJnaW5SYXRpbwAAAAEAAAAHX3RyYWRlcgQAAAALJHQwOTYyOTk3ODQJAQAAAAtnZXRQb3NpdGlvbgAAAAEFAAAAB190cmFkZXIEAAAADHBvc2l0aW9uU2l6ZQgFAAAACyR0MDk2Mjk5Nzg0AAAAAl8xBAAAAA5wb3NpdGlvbk1hcmdpbggFAAAACyR0MDk2Mjk5Nzg0AAAAAl8yBAAAABRwb3NpdGlvbk9wZW5Ob3Rpb25hbAgFAAAACyR0MDk2Mjk5Nzg0AAAAAl8zBAAAACxwb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbggFAAAACyR0MDk2Mjk5Nzg0AAAAAl80BAAAAAskdDA5NzkwOTg3NAkBAAAAI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAAAAAQUAAAAHX3RyYWRlcgQAAAAQcG9zaXRpb25Ob3Rpb25hbAgFAAAACyR0MDk3OTA5ODc0AAAAAl8xBAAAAA11bnJlYWxpemVkUG5sCAUAAAALJHQwOTc5MDk4NzQAAAACXzIEAAAADCR0MDk4NzkxMDA3MgkBAAAAImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQAAAAEBQAAAAxwb3NpdGlvblNpemUFAAAADnBvc2l0aW9uTWFyZ2luBQAAACxwb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUAAAANdW5yZWFsaXplZFBubAQAAAAMcmVtYWluTWFyZ2luCAUAAAAMJHQwOTg3OTEwMDcyAAAAAl8xBAAAAAdiYWREZWJ0CAUAAAAMJHQwOTg3OTEwMDcyAAAAAl8yCQEAAAAEZGl2ZAAAAAIJAABlAAAAAgUAAAAMcmVtYWluTWFyZ2luBQAAAAdiYWREZWJ0BQAAABBwb3NpdGlvbk5vdGlvbmFsAQAAABVpbnRlcm5hbENsb3NlUG9zaXRpb24AAAABAAAAB190cmFkZXIEAAAADSR0MDEwMTc5MTAzMzQJAQAAAAtnZXRQb3NpdGlvbgAAAAEFAAAAB190cmFkZXIEAAAADHBvc2l0aW9uU2l6ZQgFAAAADSR0MDEwMTc5MTAzMzQAAAACXzEEAAAADnBvc2l0aW9uTWFyZ2luCAUAAAANJHQwMTAxNzkxMDMzNAAAAAJfMgQAAAAUcG9zaXRpb25PcGVuTm90aW9uYWwIBQAAAA0kdDAxMDE3OTEwMzM0AAAAAl8zBAAAACxwb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbggFAAAADSR0MDEwMTc5MTAzMzQAAAACXzQEAAAADSR0MDEwMzQwMTA0MTAJAQAAACNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAAAAAEFAAAAB190cmFkZXIEAAAAAngxCAUAAAANJHQwMTAzNDAxMDQxMAAAAAJfMQQAAAANdW5yZWFsaXplZFBubAgFAAAADSR0MDEwMzQwMTA0MTAAAAACXzIEAAAADSR0MDEwNDE1MTA2MTQJAQAAACJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50AAAABAUAAAAMcG9zaXRpb25TaXplBQAAAA5wb3NpdGlvbk1hcmdpbgUAAAAscG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FAAAADXVucmVhbGl6ZWRQbmwEAAAADHJlbWFpbk1hcmdpbggFAAAADSR0MDEwNDE1MTA2MTQAAAACXzEEAAAAB2JhZERlYnQIBQAAAA0kdDAxMDQxNTEwNjE0AAAAAl8yBAAAAAJ4MggFAAAADSR0MDEwNDE1MTA2MTQAAAACXzMEAAAAFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBAAAAAS0AAAABBQAAAAxwb3NpdGlvblNpemUEAAAAC3JlYWxpemVkUG5sBQAAAA11bnJlYWxpemVkUG5sBAAAAA1tYXJnaW5Ub1ZhdWx0CQEAAAABLQAAAAEFAAAADHJlbWFpbk1hcmdpbgQAAAANJHQwMTA3NDExMTA5NgkBAAAAGmdldE91dHB1dFByaWNlV2l0aFJlc2VydmVzAAAABAkAAGYAAAACBQAAAAxwb3NpdGlvblNpemUAAAAAAAAAAAAJAQAAAANhYnMAAAABBQAAAAxwb3NpdGlvblNpemUJAQAAABJxdW91dGVBc3NldFJlc2VydmUAAAAACQEAAAAQYmFzZUFzc2V0UmVzZXJ2ZQAAAAAEAAAAGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQIBQAAAA0kdDAxMDc0MTExMDk2AAAAAl8xBAAAABZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUAAAANJHQwMTA3NDExMTA5NgAAAAJfMgQAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUAAAANJHQwMTA3NDExMTA5NgAAAAJfMwQAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyCAUAAAANJHQwMTA3NDExMTA5NgAAAAJfNAQAAAAWdG90YWxQb3NpdGlvblNpemVBZnRlcggFAAAADSR0MDEwNzQxMTEwOTYAAAACXzUEAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUAAAANJHQwMTA3NDExMTA5NgAAAAJfNgQAAAAab3BlbkludGVyZXNldE5vdGlvbmFsQWZ0ZXIJAABlAAAAAgkBAAAAFW9wZW5JbnRlcmVzZXROb3Rpb25hbAAAAAAFAAAAFHBvc2l0aW9uT3Blbk5vdGlvbmFsCQAFHQAAAAsFAAAAFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQUAAAAHYmFkRGVidAUAAAALcmVhbGl6ZWRQbmwFAAAADW1hcmdpblRvVmF1bHQFAAAAFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcgUAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyBQAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBQAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUAAAAab3BlbkludGVyZXNldE5vdGlvbmFsQWZ0ZXIFAAAAGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQBAAAADnVwZGF0ZVNldHRpbmdzAAAABAAAABBfaW5pdE1hcmdpblJhdGlvAAAAF19tYWludGVuYW5jZU1hcmdpblJhdGlvAAAAFF9saXF1aWRhdGlvbkZlZVJhdGlvAAAADl9mdW5kaW5nUGVyaW9kCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrX2luaXRNYXJnaW5SYXRpbwUAAAAQX2luaXRNYXJnaW5SYXRpbwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAYa19tYWludGVuYW5jZU1hcmdpblJhdGlvBQAAABdfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAVa19saXF1aWRhdGlvbkZlZVJhdGlvBQAAABRfbGlxdWlkYXRpb25GZWVSYXRpbwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPa19mdW5kaW5nUGVyaW9kBQAAAA5fZnVuZGluZ1BlcmlvZAUAAAADbmlsAQAAAA11cGRhdGVGdW5kaW5nAAAABAAAACBfYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZAAAABFfbmV4dEZ1bmRpbmdCbG9jawAAACBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAAAAxfZnVuZGluZ1JhdGUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIWtfYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZAUAAAAgX2Jhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmtfbmV4dEZ1bmRpbmdCbG9jawUAAAARX25leHRGdW5kaW5nQmxvY2sJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIWtfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUAAAAgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtfZnVuZGluZ1JhdGUFAAAADF9mdW5kaW5nUmF0ZQUAAAADbmlsAQAAAA51cGRhdGVQb3NpdGlvbgAAAAUAAAAIX2FkZHJlc3MAAAAFX3NpemUAAAAHX21hcmdpbgAAAAxfb3Blbk5vdGluYWwAAAAlX2xhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAOa19wb3NpdGlvblNpemUFAAAACF9hZGRyZXNzBQAAAAVfc2l6ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAQa19wb3NpdGlvbk1hcmdpbgUAAAAIX2FkZHJlc3MFAAAAB19tYXJnaW4JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA50b0NvbXBvc2l0ZUtleQAAAAIFAAAAFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFAAAACF9hZGRyZXNzBQAAAAxfb3Blbk5vdGluYWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA50b0NvbXBvc2l0ZUtleQAAAAIFAAAALmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FAAAACF9hZGRyZXNzBQAAACVfbGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQAAAANuaWwBAAAACXVwZGF0ZUFtbQAAAAYAAAATX3F1b3V0ZUFzc2V0UmVzZXJ2ZQAAABFfYmFzZUFzc2V0UmVzZXJ2ZQAAACVfYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyAAAAF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyAAAAGF9jdW11bGF0aXZlTm90aW9uYWxBZnRlcgAAABZfb3BlbkludGVyZXNldE5vdGlvbmFsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRrX3F1b3V0ZUFzc2V0UmVzZXJ2ZQUAAAATX3F1b3V0ZUFzc2V0UmVzZXJ2ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAASa19iYXNlQXNzZXRSZXNlcnZlBQAAABFfYmFzZUFzc2V0UmVzZXJ2ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAha19iYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kBQAAACVfYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNrX3RvdGFsUG9zaXRpb25TaXplBQAAABdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUa19jdW11bGF0aXZlTm90aW9uYWwFAAAAGF9jdW11bGF0aXZlTm90aW9uYWxBZnRlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXa19vcGVuSW50ZXJlc2V0Tm90aW9uYWwFAAAAFl9vcGVuSW50ZXJlc2V0Tm90aW9uYWwFAAAAA25pbAEAAAAOZGVsZXRlUG9zaXRpb24AAAABAAAACF9hZGRyZXNzCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAA50b0NvbXBvc2l0ZUtleQAAAAIFAAAADmtfcG9zaXRpb25TaXplBQAAAAhfYWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABBrX3Bvc2l0aW9uTWFyZ2luBQAAAAhfYWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQAAAAhfYWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAAC5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQAAAAhfYWRkcmVzcwUAAAADbmlsAQAAAAh3aXRoZHJhdwAAAAIAAAAIX2FkZHJlc3MAAAAHX2Ftb3VudAQAAAAHYmFsYW5jZQkAA/AAAAACBQAAAAR0aGlzBQAAAARVU0ROAwkAAGYAAAACBQAAAAdfYW1vdW50BQAAAAdiYWxhbmNlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAE1VuYWJsZSB0byB3aXRoZHJhdyAJAAGkAAAAAQUAAAAHX2Ftb3VudAIAAAAXIGZyb20gY29udHJhY3QgYmFsYW5jZSAJAAGkAAAAAQUAAAAHYmFsYW5jZQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAhfYWRkcmVzcwUAAAAHX2Ftb3VudAUAAAAEVVNETgUAAAADbmlsAQAAAA53cml0ZUNvbnN0YW50cwAAAAAJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgIAAAANQURNSU5fQUREUkVTUwkABCUAAAABBQAAAA1BRE1JTl9BRERSRVNTCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAABFVTRE4JAAJYAAAAAQUAAAAEVVNETgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACAgAAAAxVU0ROX1NUQUtJTkcJAAQlAAAAAQUAAAAMVVNETl9TVEFLSU5HCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAABk9SQUNMRQkABCUAAAABBQAAAAZPUkFDTEUFAAAAA25pbAAAAAkAAAABaQEAAAAKaW5pdGlhbGl6ZQAAAAYAAAATX3F1b3V0ZUFzc2V0UmVzZXJ2ZQAAABFfYmFzZUFzc2V0UmVzZXJ2ZQAAAA5fZnVuZGluZ1BlcmlvZAAAABBfaW5pdE1hcmdpblJhdGlvAAAAF19tYWludGVuYW5jZU1hcmdpblJhdGlvAAAAFF9saXF1aWRhdGlvbkZlZVJhdGlvAwMDAwMDAwMJAABnAAAAAgAAAAAAAAAAAAUAAAATX3F1b3V0ZUFzc2V0UmVzZXJ2ZQYJAABnAAAAAgAAAAAAAAAAAAUAAAARX2Jhc2VBc3NldFJlc2VydmUGCQAAZwAAAAIAAAAAAAAAAAAFAAAADl9mdW5kaW5nUGVyaW9kBgkAAGcAAAACAAAAAAAAAAAABQAAABBfaW5pdE1hcmdpblJhdGlvBgkAAGcAAAACAAAAAAAAAAAABQAAABdfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwYJAABnAAAAAgAAAAAAAAAAAAUAAAAUX2xpcXVpZGF0aW9uRmVlUmF0aW8GCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAADUFETUlOX0FERFJFU1MGCQEAAAALaW5pdGlhbGl6ZWQAAAAACQAAAgAAAAECAAAAHUludmFsaWQgaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAQAAAAl1cGRhdGVBbW0AAAAGBQAAABNfcXVvdXRlQXNzZXRSZXNlcnZlBQAAABFfYmFzZUFzc2V0UmVzZXJ2ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBAAAADnVwZGF0ZVNldHRpbmdzAAAABAUAAAAQX2luaXRNYXJnaW5SYXRpbwUAAAAXX21haW50ZW5hbmNlTWFyZ2luUmF0aW8FAAAAFF9saXF1aWRhdGlvbkZlZVJhdGlvBQAAAA5fZnVuZGluZ1BlcmlvZAkBAAAADXVwZGF0ZUZ1bmRpbmcAAAAEAAAAAAAAAAAACQAAZAAAAAIIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAA5fZnVuZGluZ1BlcmlvZAAAAAAAAAAAAAAAAAAAAAAAAAkBAAAADndyaXRlQ29uc3RhbnRzAAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAANa19pbml0aWFsaXplZAYFAAAAA25pbAAAAAFpAQAAABBkZWNyZWFzZVBvc2l0aW9uAAAABAAAAApfZGlyZWN0aW9uAAAAB19hbW91bnQAAAAJX2xldmVyYWdlAAAAE19taW5CYXNlQXNzZXRBbW91bnQDAwMDAwMJAQAAAAIhPQAAAAIFAAAACl9kaXJlY3Rpb24FAAAACERJUl9MT05HCQEAAAACIT0AAAACBQAAAApfZGlyZWN0aW9uBQAAAAlESVJfU0hPUlQHBgkAAGcAAAACAAAAAAAAAAAABQAAAAdfYW1vdW50BgMJAABmAAAAAgkAAGgAAAACAAAAAAAAAAABBQAAAAxERUNJTUFMX1VOSVQFAAAACV9sZXZlcmFnZQYJAABmAAAAAgUAAAAJX2xldmVyYWdlCQAAaAAAAAIAAAAAAAAAAAMFAAAADERFQ0lNQUxfVU5JVAYJAQAAAAEhAAAAAQkBAAAAC2luaXRpYWxpemVkAAAAAAYJAQAAAAEhAAAAAQkBAAAAFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8AAAADCQEAAAAEZGl2ZAAAAAIFAAAADERFQ0lNQUxfVU5JVAUAAAAJX2xldmVyYWdlCQEAAAAPaW5pdE1hcmdpblJhdGlvAAAAAAYJAAACAAAAAQIAAAAjSW52YWxpZCBkZWNyZWFzZVBvc2l0aW9uIHBhcmFtZXRlcnMEAAAADSR0MDE2MDE0MTYxOTMJAQAAAAtnZXRQb3NpdGlvbgAAAAEJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA9vbGRQb3NpdGlvblNpemUIBQAAAA0kdDAxNjAxNDE2MTkzAAAAAl8xBAAAABFvbGRQb3NpdGlvbk1hcmdpbggFAAAADSR0MDE2MDE0MTYxOTMAAAACXzIEAAAAF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUAAAANJHQwMTYwMTQxNjE5MwAAAAJfMwQAAAAvb2xkUG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24IBQAAAA0kdDAxNjAxNDE2MTkzAAAAAl80BAAAAA1pc05ld1Bvc2l0aW9uCQAAAAAAAAIFAAAAD29sZFBvc2l0aW9uU2l6ZQAAAAAAAAAAAAQAAAAPaXNTYW1lRGlyZWN0aW9uAwkAAGYAAAACBQAAAA9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAJAAAAAAAAAgUAAAAKX2RpcmVjdGlvbgUAAAAIRElSX0xPTkcJAAAAAAAAAgUAAAAKX2RpcmVjdGlvbgUAAAAJRElSX1NIT1JUBAAAAA5leHBhbmRFeGlzdGluZwMJAQAAAAEhAAAAAQUAAAANaXNOZXdQb3NpdGlvbgUAAAAPaXNTYW1lRGlyZWN0aW9uBwQAAAAFaXNBZGQJAAAAAAAAAgUAAAAKX2RpcmVjdGlvbgUAAAAIRElSX0xPTkcEAAAADSR0MDE2NDgyMTk0OTkDAwUAAAANaXNOZXdQb3NpdGlvbgYFAAAADmV4cGFuZEV4aXN0aW5nCQAAAgAAAAECAAAANVVzZSBpbmNyZWFzZVBvc2l0aW9uIHRvIG9wZW4gbmV3IG9yIGluY3JlYXNlIHBvc2l0aW9uBAAAAAxvcGVuTm90aW9uYWwJAQAAAARtdWxkAAAAAgUAAAAHX2Ftb3VudAUAAAAJX2xldmVyYWdlBAAAAA0kdDAxNzAxMDE3MTA5CQEAAAAjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwAAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAATb2xkUG9zaXRpb25Ob3Rpb25hbAgFAAAADSR0MDE3MDEwMTcxMDkAAAACXzEEAAAADXVucmVhbGl6ZWRQbmwIBQAAAA0kdDAxNzAxMDE3MTA5AAAAAl8yAwkAAGYAAAACBQAAABNvbGRQb3NpdGlvbk5vdGlvbmFsBQAAAAxvcGVuTm90aW9uYWwEAAAADSR0MDE3MTcxMTc0NTIJAQAAAAlzd2FwSW5wdXQAAAACBQAAAAVpc0FkZAUAAAAMb3Blbk5vdGlvbmFsBAAAABVleGNoYW5nZWRQb3NpdGlvblNpemUIBQAAAA0kdDAxNzE3MTE3NDUyAAAAAl8xBAAAABdxdW91dGVBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDE3MTcxMTc0NTIAAAACXzIEAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDE3MTcxMTc0NTIAAAACXzMEAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcggFAAAADSR0MDE3MTcxMTc0NTIAAAACXzQEAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQAAAA0kdDAxNzE3MTE3NDUyAAAAAl81BAAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFAAAADSR0MDE3MTcxMTc0NTIAAAACXzYEAAAAGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwkBAAAAA2FicwAAAAEFAAAAFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQMDCQEAAAACIT0AAAACBQAAABNfbWluQmFzZUFzc2V0QW1vdW50AAAAAAAAAAAACQAAZgAAAAIFAAAAE19taW5CYXNlQXNzZXRBbW91bnQFAAAAGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAmVG9vIGxpdHRsZSBiYXNzZSBhc3NldCBleGNoYW5nZWQsIGdvdCAJAAGkAAAAAQUAAAAYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzAgAAAAogZXhwZWN0ZWQgCQABpAAAAAEFAAAAE19taW5CYXNlQXNzZXRBbW91bnQEAAAAC3JlYWxpemVkUG5sAwkBAAAAAiE9AAAAAgUAAAAPb2xkUG9zaXRpb25TaXplAAAAAAAAAAAACQEAAAAEZGl2ZAAAAAIJAQAAAARtdWxkAAAAAgUAAAANdW5yZWFsaXplZFBubAUAAAAYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzBQAAAA9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAEAAAADSR0MDE3OTkzMTgzMTMJAQAAACJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50AAAABAUAAAAPb2xkUG9zaXRpb25TaXplBQAAABFvbGRQb3NpdGlvbk1hcmdpbgUAAAAvb2xkUG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FAAAAC3JlYWxpemVkUG5sBAAAAAxyZW1haW5NYXJnaW4IBQAAAA0kdDAxNzk5MzE4MzEzAAAAAl8xBAAAAAdiYWREZWJ0CAUAAAANJHQwMTc5OTMxODMxMwAAAAJfMgQAAAAOZnVuZGluZ1BheW1lbnQIBQAAAA0kdDAxNzk5MzE4MzEzAAAAAl8zBAAAACJvbGRMYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCAUAAAANJHQwMTc5OTMxODMxMwAAAAJfNAQAAAAZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUAAAAMb3Blbk5vdGlvbmFsBAAAABJ1bnJlYWxpemVkUG5sQWZ0ZXIJAABlAAAAAgUAAAANdW5yZWFsaXplZFBubAUAAAALcmVhbGl6ZWRQbmwEAAAAEnJlbWFpbk9wZW5Ob3Rpb25hbAMJAABmAAAAAgUAAAAPb2xkUG9zaXRpb25TaXplAAAAAAAAAAAACQAAZQAAAAIJAABlAAAAAgUAAAATb2xkUG9zaXRpb25Ob3Rpb25hbAUAAAAZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUAAAASdW5yZWFsaXplZFBubEFmdGVyCQAAZQAAAAIJAABkAAAAAgUAAAASdW5yZWFsaXplZFBubEFmdGVyBQAAABNvbGRQb3NpdGlvbk5vdGlvbmFsBQAAABlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CQAFHAAAAAoJAABkAAAAAgUAAAAPb2xkUG9zaXRpb25TaXplBQAAABVleGNoYW5nZWRQb3NpdGlvblNpemUFAAAADHJlbWFpbk1hcmdpbgkBAAAAA2FicwAAAAEFAAAAEnJlbWFpbk9wZW5Ob3Rpb25hbAUAAAAib2xkTGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAABdxdW91dGVBc3NldFJlc2VydmVBZnRlcgUAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyBQAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBQAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgkAAGUAAAACCQEAAAAVb3BlbkludGVyZXNldE5vdGlvbmFsAAAAAAUAAAAMb3Blbk5vdGlvbmFsCQAAAgAAAAECAAAAFENsb3NlIHBvc2l0aW9uIGZpcnN0BAAAAA9uZXdQb3NpdGlvblNpemUIBQAAAA0kdDAxNjQ4MjE5NDk5AAAAAl8xBAAAABduZXdQb3NpdGlvblJlbWFpbk1hcmdpbggFAAAADSR0MDE2NDgyMTk0OTkAAAACXzIEAAAAFm5ld1Bvc2lpb25PcGVuTm90aW9uYWwIBQAAAA0kdDAxNjQ4MjE5NDk5AAAAAl8zBAAAACpuZXdQb3NpdGlvbkxhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24IBQAAAA0kdDAxNjQ4MjE5NDk5AAAAAl80BAAAABViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQAAAA0kdDAxNjQ4MjE5NDk5AAAAAl81BAAAABdxdW91dGVBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDE2NDgyMTk0OTkAAAACXzYEAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcggFAAAADSR0MDE2NDgyMTk0OTkAAAACXzcEAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQAAAA0kdDAxNjQ4MjE5NDk5AAAAAl84BAAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFAAAADSR0MDE2NDgyMTk0OTkAAAACXzkEAAAAGm9wZW5JbnRlcmVzZXROb3Rpb25hbEFmdGVyCAUAAAANJHQwMTY0ODIxOTQ5OQAAAANfMTAJAAROAAAAAgkBAAAADnVwZGF0ZVBvc2l0aW9uAAAABQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAD25ld1Bvc2l0aW9uU2l6ZQUAAAAXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FAAAAFm5ld1Bvc2lpb25PcGVuTm90aW9uYWwFAAAAKm5ld1Bvc2l0aW9uTGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkBAAAACXVwZGF0ZUFtbQAAAAYFAAAAF3F1b3V0ZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAABViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcgUAAAAWdG90YWxQb3NpdGlvblNpemVBZnRlcgUAAAAXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFAAAAGm9wZW5JbnRlcmVzZXROb3Rpb25hbEFmdGVyAAAAAWkBAAAAEGluY3JlYXNlUG9zaXRpb24AAAADAAAACl9kaXJlY3Rpb24AAAAJX2xldmVyYWdlAAAAE19taW5CYXNlQXNzZXRBbW91bnQEAAAAB19hbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAMDAwMDAwMJAQAAAAIhPQAAAAIFAAAACl9kaXJlY3Rpb24FAAAACERJUl9MT05HCQEAAAACIT0AAAACBQAAAApfZGlyZWN0aW9uBQAAAAlESVJfU0hPUlQHBgkAAGcAAAACAAAAAAAAAAAABQAAAAdfYW1vdW50BgMJAABmAAAAAgkAAGgAAAACAAAAAAAAAAABBQAAAAxERUNJTUFMX1VOSVQFAAAACV9sZXZlcmFnZQYJAABmAAAAAgUAAAAJX2xldmVyYWdlCQAAaAAAAAIAAAAAAAAAAAMFAAAADERFQ0lNQUxfVU5JVAYJAQAAAAEhAAAAAQkBAAAAC2luaXRpYWxpemVkAAAAAAYJAQAAAAIhPQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQFAAAABFVTRE4GCQEAAAABIQAAAAEJAQAAABZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAAAAAwkBAAAABGRpdmQAAAACBQAAAAxERUNJTUFMX1VOSVQFAAAACV9sZXZlcmFnZQkBAAAAD2luaXRNYXJnaW5SYXRpbwAAAAAGCQAAAgAAAAECAAAAI0ludmFsaWQgaW5jcmVhc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBAAAAA0kdDAyMDQ0MjIwNjIxCQEAAAALZ2V0UG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAPb2xkUG9zaXRpb25TaXplCAUAAAANJHQwMjA0NDIyMDYyMQAAAAJfMQQAAAARb2xkUG9zaXRpb25NYXJnaW4IBQAAAA0kdDAyMDQ0MjIwNjIxAAAAAl8yBAAAABdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFAAAADSR0MDIwNDQyMjA2MjEAAAACXzMEAAAAL29sZFBvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCAUAAAANJHQwMjA0NDIyMDYyMQAAAAJfNAQAAAANaXNOZXdQb3NpdGlvbgkAAAAAAAACBQAAAA9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAEAAAAD2lzU2FtZURpcmVjdGlvbgMJAABmAAAAAgUAAAAPb2xkUG9zaXRpb25TaXplAAAAAAAAAAAACQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACERJUl9MT05HCQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACURJUl9TSE9SVAQAAAAOZXhwYW5kRXhpc3RpbmcDCQEAAAABIQAAAAEFAAAADWlzTmV3UG9zaXRpb24FAAAAD2lzU2FtZURpcmVjdGlvbgcEAAAABWlzQWRkCQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACERJUl9MT05HBAAAAA0kdDAyMDkxMDIzMzE4AwMFAAAADWlzTmV3UG9zaXRpb24GBQAAAA5leHBhbmRFeGlzdGluZwQAAAAMb3Blbk5vdGlvbmFsCQEAAAAEbXVsZAAAAAIFAAAAB19hbW91bnQFAAAACV9sZXZlcmFnZQQAAAANJHQwMjEzNTYyMTYwOQkBAAAACXN3YXBJbnB1dAAAAAIFAAAABWlzQWRkBQAAAAxvcGVuTm90aW9uYWwEAAAAFWFtb3VudEJhc2VBc3NldEJvdWdodAgFAAAADSR0MDIxMzU2MjE2MDkAAAACXzEEAAAAF3F1b3V0ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUAAAANJHQwMjEzNTYyMTYwOQAAAAJfMgQAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUAAAANJHQwMjEzNTYyMTYwOQAAAAJfMwQAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyCAUAAAANJHQwMjEzNTYyMTYwOQAAAAJfNAQAAAAWdG90YWxQb3NpdGlvblNpemVBZnRlcggFAAAADSR0MDIxMzU2MjE2MDkAAAACXzUEAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUAAAANJHQwMjEzNTYyMTYwOQAAAAJfNgMDCQEAAAACIT0AAAACBQAAABNfbWluQmFzZUFzc2V0QW1vdW50AAAAAAAAAAAACQAAZgAAAAIFAAAAE19taW5CYXNlQXNzZXRBbW91bnQJAQAAAANhYnMAAAABBQAAABVhbW91bnRCYXNlQXNzZXRCb3VnaHQHCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADUxpbWl0IGVycm9yOiAJAAGkAAAAAQkBAAAAA2FicwAAAAEFAAAAFWFtb3VudEJhc2VBc3NldEJvdWdodAIAAAADIDwgCQABpAAAAAEFAAAAE19taW5CYXNlQXNzZXRBbW91bnQEAAAAD25ld1Bvc2l0aW9uU2l6ZQkAAGQAAAACBQAAAA9vbGRQb3NpdGlvblNpemUFAAAAFWFtb3VudEJhc2VBc3NldEJvdWdodAQAAAAZaW5jcmVhc2VNYXJnaW5SZXF1aXJlbWVudAkBAAAABGRpdmQAAAACBQAAAAxvcGVuTm90aW9uYWwFAAAACV9sZXZlcmFnZQQAAAANJHQwMjE5OTAyMjI5MgkBAAAAImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQAAAAEBQAAAA9vbGRQb3NpdGlvblNpemUFAAAAEW9sZFBvc2l0aW9uTWFyZ2luBQAAAC9vbGRQb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUAAAAZaW5jcmVhc2VNYXJnaW5SZXF1aXJlbWVudAQAAAAMcmVtYWluTWFyZ2luCAUAAAANJHQwMjE5OTAyMjI5MgAAAAJfMQQAAAACeDEIBQAAAA0kdDAyMTk5MDIyMjkyAAAAAl8yBAAAAAJ4MggFAAAADSR0MDIxOTkwMjIyOTIAAAACXzMEAAAAIm9sZExhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24IBQAAAA0kdDAyMTk5MDIyMjkyAAAAAl80CQAFHAAAAAoFAAAAD25ld1Bvc2l0aW9uU2l6ZQUAAAAMcmVtYWluTWFyZ2luCQAAZAAAAAIFAAAAF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBQAAAAxvcGVuTm90aW9uYWwFAAAAIm9sZExhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcgUAAAAXcXVvdXRlQXNzZXRSZXNlcnZlQWZ0ZXIFAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcgUAAAAWdG90YWxQb3NpdGlvblNpemVBZnRlcgUAAAAXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIJAABkAAAAAgkBAAAAFW9wZW5JbnRlcmVzZXROb3Rpb25hbAAAAAAFAAAADG9wZW5Ob3Rpb25hbAQAAAAMb3Blbk5vdGlvbmFsCQEAAAAEbXVsZAAAAAIFAAAAB19hbW91bnQFAAAACV9sZXZlcmFnZQQAAAANJHQwMjMwMjgyMzEyNwkBAAAAI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAAAAAQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAE29sZFBvc2l0aW9uTm90aW9uYWwIBQAAAA0kdDAyMzAyODIzMTI3AAAAAl8xBAAAAA11bnJlYWxpemVkUG5sCAUAAAANJHQwMjMwMjgyMzEyNwAAAAJfMgMJAABmAAAAAgUAAAATb2xkUG9zaXRpb25Ob3Rpb25hbAUAAAAMb3Blbk5vdGlvbmFsCQAAAgAAAAECAAAALlVzZSBkZWNyZWFzZVBvc2l0aW9uIHRvIGRlY3JlYXNlIHBvc2l0aW9uIHNpemUJAAACAAAAAQIAAAAUQ2xvc2UgcG9zaXRpb24gZmlyc3QEAAAAD25ld1Bvc2l0aW9uU2l6ZQgFAAAADSR0MDIwOTEwMjMzMTgAAAACXzEEAAAAF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luCAUAAAANJHQwMjA5MTAyMzMxOAAAAAJfMgQAAAAWbmV3UG9zaWlvbk9wZW5Ob3Rpb25hbAgFAAAADSR0MDIwOTEwMjMzMTgAAAACXzMEAAAAKm5ld1Bvc2l0aW9uTGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbggFAAAADSR0MDIwOTEwMjMzMTgAAAACXzQEAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDIwOTEwMjMzMTgAAAACXzUEAAAAF3F1b3V0ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUAAAANJHQwMjA5MTAyMzMxOAAAAAJfNgQAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyCAUAAAANJHQwMjA5MTAyMzMxOAAAAAJfNwQAAAAWdG90YWxQb3NpdGlvblNpemVBZnRlcggFAAAADSR0MDIwOTEwMjMzMTgAAAACXzgEAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUAAAANJHQwMjA5MTAyMzMxOAAAAAJfOQQAAAAab3BlbkludGVyZXNldE5vdGlvbmFsQWZ0ZXIIBQAAAA0kdDAyMDkxMDIzMzE4AAAAA18xMAQAAAAFc3Rha2UJAAP8AAAABAUAAAAMVVNETl9TVEFLSU5HAgAAAAxsb2NrTmV1dHJpbm8FAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAEVVNETgUAAAAHX2Ftb3VudAUAAAADbmlsAwkAAAAAAAACBQAAAAVzdGFrZQUAAAAFc3Rha2UJAAROAAAAAgkBAAAADnVwZGF0ZVBvc2l0aW9uAAAABQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAD25ld1Bvc2l0aW9uU2l6ZQUAAAAXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FAAAAFm5ld1Bvc2lpb25PcGVuTm90aW9uYWwFAAAAKm5ld1Bvc2l0aW9uTGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkBAAAACXVwZGF0ZUFtbQAAAAYFAAAAF3F1b3V0ZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAABViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcgUAAAAWdG90YWxQb3NpdGlvblNpemVBZnRlcgUAAAAXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFAAAAGm9wZW5JbnRlcmVzZXROb3Rpb25hbEFmdGVyCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAlhZGRNYXJnaW4AAAAABAAAAAdfYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQDAwkBAAAAAiE9AAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAUAAAAEVVNETgYJAQAAAAEhAAAAAQkBAAAAE3JlcXVpcmVPcGVuUG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAABxJbnZhbGlkIGFkZE1hcmdpbiBwYXJhbWV0ZXJzBAAAAA0kdDAyNDEwMjI0MjgxCQEAAAALZ2V0UG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAPb2xkUG9zaXRpb25TaXplCAUAAAANJHQwMjQxMDIyNDI4MQAAAAJfMQQAAAARb2xkUG9zaXRpb25NYXJnaW4IBQAAAA0kdDAyNDEwMjI0MjgxAAAAAl8yBAAAABdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFAAAADSR0MDI0MTAyMjQyODEAAAACXzMEAAAAL29sZFBvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCAUAAAANJHQwMjQxMDIyNDI4MQAAAAJfNAQAAAAFc3Rha2UJAAP8AAAABAUAAAAMVVNETl9TVEFLSU5HAgAAAAxsb2NrTmV1dHJpbm8FAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAEVVNETgUAAAAHX2Ftb3VudAUAAAADbmlsAwkAAAAAAAACBQAAAAVzdGFrZQUAAAAFc3Rha2UJAQAAAA51cGRhdGVQb3NpdGlvbgAAAAUJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAA9vbGRQb3NpdGlvblNpemUJAABkAAAAAgUAAAARb2xkUG9zaXRpb25NYXJnaW4ICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAUAAAAXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFAAAAL29sZFBvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAxyZW1vdmVNYXJnaW4AAAABAAAAB19hbW91bnQDAwkAAGcAAAACAAAAAAAAAAAABQAAAAdfYW1vdW50BgkBAAAAASEAAAABCQEAAAATcmVxdWlyZU9wZW5Qb3NpdGlvbgAAAAEJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAAH0ludmFsaWQgcmVtb3ZlTWFyZ2luIHBhcmFtZXRlcnMEAAAADSR0MDI0ODIxMjUwMDAJAQAAAAtnZXRQb3NpdGlvbgAAAAEJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA9vbGRQb3NpdGlvblNpemUIBQAAAA0kdDAyNDgyMTI1MDAwAAAAAl8xBAAAABFvbGRQb3NpdGlvbk1hcmdpbggFAAAADSR0MDI0ODIxMjUwMDAAAAACXzIEAAAAF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUAAAANJHQwMjQ4MjEyNTAwMAAAAAJfMwQAAAAvb2xkUG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24IBQAAAA0kdDAyNDgyMTI1MDAwAAAAAl80BAAAAAttYXJnaW5EZWx0YQkBAAAAAS0AAAABBQAAAAdfYW1vdW50BAAAAA0kdDAyNTAzNzI1MjgxCQEAAAAiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAAAAAQFAAAAD29sZFBvc2l0aW9uU2l6ZQUAAAARb2xkUG9zaXRpb25NYXJnaW4FAAAAL29sZFBvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQAAAAttYXJnaW5EZWx0YQQAAAAMcmVtYWluTWFyZ2luCAUAAAANJHQwMjUwMzcyNTI4MQAAAAJfMQQAAAAHYmFkRGVidAgFAAAADSR0MDI1MDM3MjUyODEAAAACXzIEAAAAAngxCAUAAAANJHQwMjUwMzcyNTI4MQAAAAJfMwQAAAAgbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbjEIBQAAAA0kdDAyNTAzNzI1MjgxAAAAAl80AwkBAAAAAiE9AAAAAgUAAAAHYmFkRGVidAAAAAAAAAAAAAkAAAIAAAABAgAAABtJbnZhbGlkIGFkZGVkIG1hcmdpbiBhbW91bnQEAAAAB3Vuc3Rha2UJAAP8AAAABAUAAAAMVVNETl9TVEFLSU5HAgAAAA51bmxvY2tOZXV0cmlubwkABEwAAAACBQAAAAdfYW1vdW50CQAETAAAAAIJAAJYAAAAAQUAAAAEVVNETgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAB3Vuc3Rha2UFAAAAB3Vuc3Rha2UJAAROAAAAAgkBAAAADnVwZGF0ZVBvc2l0aW9uAAAABQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAD29sZFBvc2l0aW9uU2l6ZQUAAAAMcmVtYWluTWFyZ2luBQAAABdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAUAAAAgbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbjEJAQAAAAh3aXRoZHJhdwAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAHX2Ftb3VudAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAANY2xvc2VQb3NpdGlvbgAAAAADCQEAAAABIQAAAAEJAQAAABNyZXF1aXJlT3BlblBvc2l0aW9uAAAAAQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAAgSW52YWxpZCBjbG9zZVBvc2l0aW9uIHBhcmFtZXRlcnMEAAAADSR0MDI1OTEwMjYyNjgJAQAAABVpbnRlcm5hbENsb3NlUG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAACeDEIBQAAAA0kdDAyNTkxMDI2MjY4AAAAAl8xBAAAAAdiYWREZWJ0CAUAAAANJHQwMjU5MTAyNjI2OAAAAAJfMgQAAAALcmVhbGl6ZWRQbmwIBQAAAA0kdDAyNTkxMDI2MjY4AAAAAl8zBAAAAA1tYXJnaW5Ub1ZhdWx0CAUAAAANJHQwMjU5MTAyNjI2OAAAAAJfNAQAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDI1OTEwMjYyNjgAAAACXzUEAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDI1OTEwMjYyNjgAAAACXzYEAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcggFAAAADSR0MDI1OTEwMjYyNjgAAAACXzcEAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQAAAA0kdDAyNTkxMDI2MjY4AAAAAl84BAAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFAAAADSR0MDI1OTEwMjYyNjgAAAACXzkEAAAAGm9wZW5JbnRlcmVzZXROb3Rpb25hbEFmdGVyCAUAAAANJHQwMjU5MTAyNjI2OAAAAANfMTADCQAAZgAAAAIFAAAAB2JhZERlYnQAAAAAAAAAAAAJAAACAAAAAQIAAAAmVW5hYmxlIHRvIGNsb3NlIHBvc2l0aW9uIHdpdGggYmFkIGRlYnQEAAAADndpdGhkcmF3QW1vdW50CQEAAAADYWJzAAAAAQUAAAANbWFyZ2luVG9WYXVsdAQAAAAHdW5zdGFrZQkAA/wAAAAEBQAAAAxVU0ROX1NUQUtJTkcCAAAADnVubG9ja05ldXRyaW5vCQAETAAAAAIFAAAADndpdGhkcmF3QW1vdW50CQAETAAAAAIJAAJYAAAAAQUAAAAEVVNETgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAB3Vuc3Rha2UFAAAAB3Vuc3Rha2UJAAROAAAAAgkABE4AAAACCQEAAAAOZGVsZXRlUG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkBAAAACXVwZGF0ZUFtbQAAAAYFAAAAFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcgUAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyBQAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBQAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUAAAAab3BlbkludGVyZXNldE5vdGlvbmFsQWZ0ZXIJAQAAAAh3aXRoZHJhdwAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAOd2l0aGRyYXdBbW91bnQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACWxpcXVpZGF0ZQAAAAEAAAAHX3RyYWRlcgMDCQEAAAABIQAAAAEJAQAAABZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAAAAAwkBAAAADmdldE1hcmdpblJhdGlvAAAAAQUAAAAHX3RyYWRlcgkBAAAAFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8AAAAABwYJAQAAAAEhAAAAAQkBAAAAC2luaXRpYWxpemVkAAAAAAkAAAIAAAABAgAAABNVbmFibGUgdG8gbGlxdWlkYXRlBAAAAA0kdDAyNzEzODI3NDY4CQEAAAAVaW50ZXJuYWxDbG9zZVBvc2l0aW9uAAAAAQUAAAAHX3RyYWRlcgQAAAACeDEIBQAAAA0kdDAyNzEzODI3NDY4AAAAAl8xBAAAAAdiYWREZWJ0CAUAAAANJHQwMjcxMzgyNzQ2OAAAAAJfMgQAAAACeDIIBQAAAA0kdDAyNzEzODI3NDY4AAAAAl8zBAAAAA1tYXJnaW5Ub1ZhdWx0CAUAAAANJHQwMjcxMzgyNzQ2OAAAAAJfNAQAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDI3MTM4Mjc0NjgAAAACXzUEAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDI3MTM4Mjc0NjgAAAACXzYEAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcggFAAAADSR0MDI3MTM4Mjc0NjgAAAACXzcEAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQAAAA0kdDAyNzEzODI3NDY4AAAAAl84BAAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFAAAADSR0MDI3MTM4Mjc0NjgAAAACXzkEAAAAGm9wZW5JbnRlcmVzZXROb3Rpb25hbEFmdGVyCAUAAAANJHQwMjcxMzgyNzQ2OAAAAANfMTAEAAAAGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQIBQAAAA0kdDAyNzEzODI3NDY4AAAAA18xMQQAAAAPZmVlVG9MaXF1aWRhdG9yCQAAaQAAAAIJAQAAAARtdWxkAAAAAgUAAAAZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBAAAAE2xpcXVpZGF0aW9uRmVlUmF0aW8AAAAAAAAAAAAAAAACBAAAAA0kdDAyNzU1ODI3OTYyAwkAAGYAAAACBQAAAA9mZWVUb0xpcXVpZGF0b3IFAAAADW1hcmdpblRvVmF1bHQJAAUVAAAAAwkAAGUAAAACBQAAAA9mZWVUb0xpcXVpZGF0b3IFAAAADW1hcmdpblRvVmF1bHQFAAAADW1hcmdpblRvVmF1bHQJAABlAAAAAgkAAGQAAAACBQAAAAdiYWREZWJ0BQAAAA9mZWVUb0xpcXVpZGF0b3IFAAAADW1hcmdpblRvVmF1bHQJAAUVAAAAAwAAAAAAAAAAAAkAAGUAAAACBQAAAA1tYXJnaW5Ub1ZhdWx0BQAAAA9mZWVUb0xpcXVpZGF0b3IFAAAAB2JhZERlYnQEAAAAEmxpcXVpZGF0aW9uQmFkRGVidAgFAAAADSR0MDI3NTU4Mjc5NjIAAAACXzEEAAAADHJlbWFpbk1hcmdpbggFAAAADSR0MDI3NTU4Mjc5NjIAAAACXzIEAAAADHRvdGFsQmFkRGVidAgFAAAADSR0MDI3NTU4Mjc5NjIAAAACXzMJAAROAAAAAgkABE4AAAACCQEAAAAOZGVsZXRlUG9zaXRpb24AAAABBQAAAAdfdHJhZGVyCQEAAAAJdXBkYXRlQW1tAAAABgUAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIFAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBQAAABpvcGVuSW50ZXJlc2V0Tm90aW9uYWxBZnRlcgkBAAAACHdpdGhkcmF3AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAA9mZWVUb0xpcXVpZGF0b3IAAAABaQEAAAAKcGF5RnVuZGluZwAAAAAEAAAAFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAkBAAAAGW5leHRGdW5kaW5nQmxvY2tUaW1lc3RhbXAAAAAAAwMJAABmAAAAAgUAAAAVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAYJAQAAAAEhAAAAAQkBAAAAC2luaXRpYWxpemVkAAAAAAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACFJbnZhbGlkIGZ1bmRpbmcgYmxvY2sgdGltZXN0YW1wOiAJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXACAAAAAyA8IAkAAaQAAAABBQAAABVmdW5kaW5nQmxvY2tUaW1lc3RhbXAEAAAAD3VuZGVybHlpbmdQcmljZQkBAAAAEmdldE9yYWNsZVR3YXBQcmljZQAAAAAEAAAADXNwb3RUd2FwUHJpY2UJAQAAABBnZXRUd2FwU3BvdFByaWNlAAAAAAQAAAAHcHJlbWl1bQkAAGUAAAACBQAAAA1zcG90VHdhcFByaWNlBQAAAA91bmRlcmx5aW5nUHJpY2UEAAAAD3ByZW1pdW1GcmFjdGlvbgkBAAAABGRpdmQAAAACCQEAAAAEbXVsZAAAAAIFAAAAB3ByZW1pdW0JAQAAABRmdW5kaW5nUGVyaW9kRGVjaW1hbAAAAAAFAAAAB09ORV9EQVkEAAAAF3RvdGFsVHJhZGVyUG9zaXRpb25TaXplCQEAAAARdG90YWxQb3NpdGlvblNpemUAAAAABAAAABdhbW1GdW5kaW5nUGF5bWVudFByb2ZpdAkBAAAABG11bGQAAAACBQAAAA9wcmVtaXVtRnJhY3Rpb24FAAAAF3RvdGFsVHJhZGVyUG9zaXRpb25TaXplCQEAAAANdXBkYXRlRnVuZGluZwAAAAQAAAAAAAAAAAAJAABkAAAAAgUAAAAVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEAAAAUZnVuZGluZ1BlcmlvZFNlY29uZHMAAAAACQAAZAAAAAIJAQAAAB9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAAAAAUAAAAPcHJlbWl1bUZyYWN0aW9uCQEAAAAEZGl2ZAAAAAIFAAAAD3ByZW1pdW1GcmFjdGlvbgUAAAAPdW5kZXJseWluZ1ByaWNlAAAAAWkBAAAAEnZpZXdfY2xvc2VQb3NpdGlvbgAAAAAEAAAADSR0MDI5MTg2MjkzMzAJAQAAABVpbnRlcm5hbENsb3NlUG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAACeDEIBQAAAA0kdDAyOTE4NjI5MzMwAAAAAl8xBAAAAAJ4MggFAAAADSR0MDI5MTg2MjkzMzAAAAACXzIEAAAAAngzCAUAAAANJHQwMjkxODYyOTMzMAAAAAJfMwQAAAACeDQIBQAAAA0kdDAyOTE4NjI5MzMwAAAAAl80BAAAAAJ4NQgFAAAADSR0MDI5MTg2MjkzMzAAAAACXzUEAAAAAng2CAUAAAANJHQwMjkxODYyOTMzMAAAAAJfNgQAAAACeDcIBQAAAA0kdDAyOTE4NjI5MzMwAAAAAl83BAAAAAJ4OAgFAAAADSR0MDI5MTg2MjkzMzAAAAACXzgEAAAAAng5CAUAAAANJHQwMjkxODYyOTMzMAAAAAJfOQQAAAADeDEwCAUAAAANJHQwMjkxODYyOTMzMAAAAANfMTAJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAIxPQkAAaQAAAABBQAAAAJ4MQIAAAADIDI9CQABpAAAAAEFAAAAAngyAgAAAAMgMz0JAAGkAAAAAQUAAAACeDMCAAAAAyA0PQkAAaQAAAABBQAAAAJ4NAIAAAADIDU9CQABpAAAAAEFAAAAAng1AgAAAAMgNj0JAAGkAAAAAQUAAAACeDYCAAAAAyA3PQkAAaQAAAABBQAAAAJ4NwIAAAADIDg9CQABpAAAAAEFAAAAAng4AgAAAAMgOT0JAAGkAAAAAQUAAAACeDkCAAAABCAxMD0JAAGkAAAAAQUAAAADeDEwAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXnDktWk", "height": 2046011, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let ora_k_price = "price"
5+
6+let k_positionSize = "k_positionSize"
7+
8+let k_positionMargin = "k_positionMargin"
9+
10+let k_positionOpenNotional = "k_positionOpenNotional"
11+
12+let k_positionLastUpdatedCumulativePremiumFraction = "k_positionFraction"
13+
14+let k_initialized = "k_initialized"
15+
16+let k_fundingPeriod = "k_fundingPeriod"
17+
18+let k_initMarginRatio = "k_initMarginRatio"
19+
20+let k_maintenanceMarginRatio = "k_maintenanceMarginRatio"
21+
22+let k_liquidationFeeRatio = "k_liquidationFeeRatio"
23+
24+let k_latestCumulativePremiumFraction = "k_latestPremiumFraction"
25+
26+let k_nextFundingBlock = "k_nextFundingBlockMinTimestamp"
27+
28+let k_fundingRate = "k_fundingRate"
29+
30+let k_quouteAssetReserve = "k_quouteAssetReserve"
31+
32+let k_baseAssetReserve = "k_baseAssetReserve"
33+
34+let k_baseAssetDeltaThisFundingPeriod = "k_baseAssetDelta"
35+
36+let k_totalPositionSize = "k_totalPositionSize"
37+
38+let k_cumulativeNotional = "k_cumulativeNotional"
39+
40+let k_openInteresetNotional = "k_openInteresetNotional"
41+
42+let ADMIN_ADDRESS = Address(base58'3N1jrg2dn93vaGJhx6dWLB8a8xuf5M92Hxi')
43+
44+let USDN = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
45+
46+let USDN_STAKING = Address(base58'3N9LkJahTMx41wGhSxLS42prCZtRCp4dhTs')
47+
48+let ORACLE = Address(base58'3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx')
49+
50+let DIR_LONG = 1
51+
52+let DIR_SHORT = 2
53+
54+let FUNDING_BLOCK_INTERVAL = 60
55+
56+let SECONDS = 1000
57+
58+let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
59+
60+let ONE_DAY = (86400 * DECIMAL_UNIT)
61+
62+func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
63+
64+
65+func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
66+
67+
68+func abs (_x) = if ((_x > 0))
69+ then _x
70+ else -(_x)
71+
72+
73+func toCompositeKey (_key,_address) = ((_key + "_") + _address)
74+
75+
76+func requireMoreMarginRatio (_marginRatio,_baseMarginRatio,_largerThanOrEqualTo) = {
77+ let remainingMarginRatio = (_marginRatio - _baseMarginRatio)
78+ if (if (_largerThanOrEqualTo)
79+ then (0 > remainingMarginRatio)
80+ else false)
81+ then throw("Invalid margin")
82+ else if (if (!(_largerThanOrEqualTo))
83+ then (remainingMarginRatio >= 0)
84+ else false)
85+ then throw("Invalid margin")
86+ else true
87+ }
88+
89+
90+func initMarginRatio () = valueOrErrorMessage(getInteger(this, k_initMarginRatio), "no value for initMarginRatio")
91+
92+
93+func quouteAssetReserve () = valueOrErrorMessage(getInteger(this, k_quouteAssetReserve), "no value for quouteAssetReserve")
94+
95+
96+func baseAssetReserve () = valueOrErrorMessage(getInteger(this, k_baseAssetReserve), "no value for baseAssetReserve")
97+
98+
99+func baseAssetDeltaThisFundingPeriod () = valueOrErrorMessage(getInteger(this, k_baseAssetDeltaThisFundingPeriod), "no value for baseAssetDeltaThisFundingPeriod")
100+
101+
102+func totalPositionSize () = valueOrErrorMessage(getInteger(this, k_totalPositionSize), "no value for totalPositionSize")
103+
104+
105+func cumulativeNotional () = valueOrErrorMessage(getInteger(this, k_cumulativeNotional), "no value for cumulativeNotional")
106+
107+
108+func latestCumulativePremiumFraction () = valueOrErrorMessage(getInteger(this, k_latestCumulativePremiumFraction), "no value for latestCumulativePremiumFraction")
109+
110+
111+func openInteresetNotional () = valueOrErrorMessage(getInteger(this, k_openInteresetNotional), "no value for openInteresetNotional")
112+
113+
114+func nextFundingBlockTimestamp () = valueOrErrorMessage(getInteger(this, k_nextFundingBlock), "no value for nextFundingBlockTimestamp")
115+
116+
117+func fundingPeriodRaw () = valueOrErrorMessage(getInteger(this, k_fundingPeriod), "no value for fundingPeriod")
118+
119+
120+func fundingPeriodDecimal () = (fundingPeriodRaw() * DECIMAL_UNIT)
121+
122+
123+func fundingPeriodSeconds () = (fundingPeriodRaw() * SECONDS)
124+
125+
126+func maintenanceMarginRatio () = valueOrErrorMessage(getInteger(this, k_maintenanceMarginRatio), "no value for maintenanceMarginRatio")
127+
128+
129+func liquidationFeeRatio () = valueOrErrorMessage(getInteger(this, k_liquidationFeeRatio), "no value for liquidationFeeRatio")
130+
131+
132+func getPosition (invesor) = {
133+ let positionSizeOpt = getInteger(this, toCompositeKey(k_positionSize, invesor))
134+ match positionSizeOpt {
135+ case positionSize: Int =>
136+ $Tuple4(positionSize, getIntegerValue(this, toCompositeKey(k_positionMargin, invesor)), getIntegerValue(this, toCompositeKey(k_positionOpenNotional, invesor)), getIntegerValue(this, toCompositeKey(k_positionLastUpdatedCumulativePremiumFraction, invesor)))
137+ case _ =>
138+ $Tuple4(0, 0, 0, 0)
139+ }
140+ }
141+
142+
143+func requireOpenPosition (_trader) = {
144+ let $t047794934 = getPosition(_trader)
145+ let positionSize = $t047794934._1
146+ let positionMargin = $t047794934._2
147+ let positionOpenNotional = $t047794934._3
148+ let positionLastUpdatedCumulativePremiumFraction = $t047794934._4
149+ if ((positionSize == 0))
150+ then throw("No open position")
151+ else true
152+ }
153+
154+
155+func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
156+
157+
158+func updateReserve (_isAdd,_quoteAssetAmount,_baseAssetAmount) = if (_isAdd)
159+ then $Tuple5((quouteAssetReserve() + _quoteAssetAmount), (baseAssetReserve() - _baseAssetAmount), (baseAssetDeltaThisFundingPeriod() - _baseAssetAmount), (totalPositionSize() + _baseAssetAmount), (cumulativeNotional() + _quoteAssetAmount))
160+ else $Tuple5((quouteAssetReserve() - _quoteAssetAmount), (baseAssetReserve() + _baseAssetAmount), (baseAssetDeltaThisFundingPeriod() + _baseAssetAmount), (totalPositionSize() - _baseAssetAmount), (cumulativeNotional() - _quoteAssetAmount))
161+
162+
163+func swapInput (_isAdd,_quoteAssetAmoun) = {
164+ let _quouteAssetReserve = quouteAssetReserve()
165+ let _baseAssetReserve = baseAssetReserve()
166+ let k = muld(_quouteAssetReserve, _baseAssetReserve)
167+ let quouteAssetReserveAfter = if (_isAdd)
168+ then (_quouteAssetReserve + _quoteAssetAmoun)
169+ else (_quouteAssetReserve - _quoteAssetAmoun)
170+ let baseAssetReserveAfter = divd(k, quouteAssetReserveAfter)
171+ let amountBaseAssetBoughtAbs = abs((baseAssetReserveAfter - _baseAssetReserve))
172+ let amountBaseAssetBought = if (_isAdd)
173+ then amountBaseAssetBoughtAbs
174+ else -(amountBaseAssetBoughtAbs)
175+ let $t064106646 = updateReserve(_isAdd, _quoteAssetAmoun, amountBaseAssetBoughtAbs)
176+ let quouteAssetReserveAfter1 = $t064106646._1
177+ let baseAssetReserveAfter1 = $t064106646._2
178+ let baseAssetDeltaThisFundingPeriodAfter1 = $t064106646._3
179+ let totalPositionSizeAfter1 = $t064106646._4
180+ let cumulativeNotionalAfter1 = $t064106646._5
181+ $Tuple6(amountBaseAssetBought, quouteAssetReserveAfter1, baseAssetReserveAfter1, baseAssetDeltaThisFundingPeriodAfter1, totalPositionSizeAfter1, cumulativeNotionalAfter1)
182+ }
183+
184+
185+func calcRemainMarginWithFundingPayment (_oldPositionSize,_oldPositionMargin,_oldPositionLastUpdatedCumulativePremiumFraction,_marginDelta) = {
186+ let _latestCumulativePremiumFraction = latestCumulativePremiumFraction()
187+ let fundingPayment = if ((_oldPositionSize != 0))
188+ then muld((_latestCumulativePremiumFraction - _oldPositionLastUpdatedCumulativePremiumFraction), _oldPositionSize)
189+ else 0
190+ let signedMargin = ((_marginDelta - fundingPayment) + _oldPositionMargin)
191+ let $t073787505 = if ((0 > signedMargin))
192+ then $Tuple2(0, abs(signedMargin))
193+ else $Tuple2(abs(signedMargin), 0)
194+ let remainMargin = $t073787505._1
195+ let badDebt = $t073787505._2
196+ $Tuple4(remainMargin, badDebt, fundingPayment, _latestCumulativePremiumFraction)
197+ }
198+
199+
200+func getOutputPriceWithReserves (_add,_baseAssetAmount,_quoteAssetPoolAmount,_baseAssetPoolAmount) = if ((_baseAssetAmount == 0))
201+ then throw("Invalid base asset amount")
202+ else {
203+ let k = muld(_quoteAssetPoolAmount, _baseAssetPoolAmount)
204+ let baseAssetPoolAmountAfter = if (_add)
205+ then (_baseAssetPoolAmount + _baseAssetAmount)
206+ else (_baseAssetPoolAmount - _baseAssetAmount)
207+ let quoteAssetAfter = divd(k, baseAssetPoolAmountAfter)
208+ let quoteAssetSold = abs((quoteAssetAfter - _quoteAssetPoolAmount))
209+ let $t081768413 = updateReserve(!(_add), quoteAssetSold, _baseAssetAmount)
210+ let quouteAssetReserveAfter1 = $t081768413._1
211+ let baseAssetReserveAfter1 = $t081768413._2
212+ let baseAssetDeltaThisFundingPeriodAfter1 = $t081768413._3
213+ let totalPositionSizeAfter1 = $t081768413._4
214+ let cumulativeNotionalAfter1 = $t081768413._5
215+ $Tuple6(quoteAssetSold, quouteAssetReserveAfter1, baseAssetReserveAfter1, baseAssetDeltaThisFundingPeriodAfter1, totalPositionSizeAfter1, cumulativeNotionalAfter1)
216+ }
217+
218+
219+func getPositionNotionalAndUnrealizedPnl (_trader) = {
220+ let $t086898844 = getPosition(_trader)
221+ let positionSize = $t086898844._1
222+ let positionMargin = $t086898844._2
223+ let positionOpenNotional = $t086898844._3
224+ let positionLastUpdatedCumulativePremiumFraction = $t086898844._4
225+ let positionSizeAbs = abs(positionSize)
226+ if ((positionSizeAbs == 0))
227+ then throw("Invalid position size")
228+ else {
229+ let isShort = (0 > positionSize)
230+ let $t090219193 = getOutputPriceWithReserves(!(isShort), positionSizeAbs, quouteAssetReserve(), baseAssetReserve())
231+ let positionNotional = $t090219193._1
232+ let x1 = $t090219193._2
233+ let x2 = $t090219193._3
234+ let x3 = $t090219193._4
235+ let unrealizedPnl = if (isShort)
236+ then (positionOpenNotional - positionNotional)
237+ else (positionNotional - positionOpenNotional)
238+ $Tuple2(positionNotional, unrealizedPnl)
239+ }
240+ }
241+
242+
243+func getOracleTwapPrice () = getIntegerValue(ORACLE, ora_k_price)
244+
245+
246+func getTwapSpotPrice () = divd(quouteAssetReserve(), baseAssetReserve())
247+
248+
249+func getMarginRatio (_trader) = {
250+ let $t096299784 = getPosition(_trader)
251+ let positionSize = $t096299784._1
252+ let positionMargin = $t096299784._2
253+ let positionOpenNotional = $t096299784._3
254+ let positionLastUpdatedCumulativePremiumFraction = $t096299784._4
255+ let $t097909874 = getPositionNotionalAndUnrealizedPnl(_trader)
256+ let positionNotional = $t097909874._1
257+ let unrealizedPnl = $t097909874._2
258+ let $t0987910072 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLastUpdatedCumulativePremiumFraction, unrealizedPnl)
259+ let remainMargin = $t0987910072._1
260+ let badDebt = $t0987910072._2
261+ divd((remainMargin - badDebt), positionNotional)
262+ }
263+
264+
265+func internalClosePosition (_trader) = {
266+ let $t01017910334 = getPosition(_trader)
267+ let positionSize = $t01017910334._1
268+ let positionMargin = $t01017910334._2
269+ let positionOpenNotional = $t01017910334._3
270+ let positionLastUpdatedCumulativePremiumFraction = $t01017910334._4
271+ let $t01034010410 = getPositionNotionalAndUnrealizedPnl(_trader)
272+ let x1 = $t01034010410._1
273+ let unrealizedPnl = $t01034010410._2
274+ let $t01041510614 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLastUpdatedCumulativePremiumFraction, unrealizedPnl)
275+ let remainMargin = $t01041510614._1
276+ let badDebt = $t01041510614._2
277+ let x2 = $t01041510614._3
278+ let exchangedPositionSize = -(positionSize)
279+ let realizedPnl = unrealizedPnl
280+ let marginToVault = -(remainMargin)
281+ let $t01074111096 = getOutputPriceWithReserves((positionSize > 0), abs(positionSize), quouteAssetReserve(), baseAssetReserve())
282+ let exchangedQuoteAssetAmount = $t01074111096._1
283+ let quoteAssetReserveAfter = $t01074111096._2
284+ let baseAssetReserveAfter = $t01074111096._3
285+ let baseAssetDeltaThisFundingPeriodAfter = $t01074111096._4
286+ let totalPositionSizeAfter = $t01074111096._5
287+ let cumulativeNotionalAfter = $t01074111096._6
288+ let openInteresetNotionalAfter = (openInteresetNotional() - positionOpenNotional)
289+ $Tuple11(exchangedPositionSize, badDebt, realizedPnl, marginToVault, quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter, exchangedQuoteAssetAmount)
290+ }
291+
292+
293+func updateSettings (_initMarginRatio,_maintenanceMarginRatio,_liquidationFeeRatio,_fundingPeriod) = [IntegerEntry(k_initMarginRatio, _initMarginRatio), IntegerEntry(k_maintenanceMarginRatio, _maintenanceMarginRatio), IntegerEntry(k_liquidationFeeRatio, _liquidationFeeRatio), IntegerEntry(k_fundingPeriod, _fundingPeriod)]
294+
295+
296+func updateFunding (_baseAssetDeltaThisFundingPeriod,_nextFundingBlock,_latestCumulativePremiumFraction,_fundingRate) = [IntegerEntry(k_baseAssetDeltaThisFundingPeriod, _baseAssetDeltaThisFundingPeriod), IntegerEntry(k_nextFundingBlock, _nextFundingBlock), IntegerEntry(k_latestCumulativePremiumFraction, _latestCumulativePremiumFraction), IntegerEntry(k_fundingRate, _fundingRate)]
297+
298+
299+func updatePosition (_address,_size,_margin,_openNotinal,_lastUpdatedCumulativePremiumFraction) = [IntegerEntry(toCompositeKey(k_positionSize, _address), _size), IntegerEntry(toCompositeKey(k_positionMargin, _address), _margin), IntegerEntry(toCompositeKey(k_positionOpenNotional, _address), _openNotinal), IntegerEntry(toCompositeKey(k_positionLastUpdatedCumulativePremiumFraction, _address), _lastUpdatedCumulativePremiumFraction)]
300+
301+
302+func updateAmm (_quouteAssetReserve,_baseAssetReserve,_baseAssetDeltaThisFundingPeriodAfter,_totalPositionSizeAfter,_cumulativeNotionalAfter,_openInteresetNotional) = [IntegerEntry(k_quouteAssetReserve, _quouteAssetReserve), IntegerEntry(k_baseAssetReserve, _baseAssetReserve), IntegerEntry(k_baseAssetDeltaThisFundingPeriod, _baseAssetDeltaThisFundingPeriodAfter), IntegerEntry(k_totalPositionSize, _totalPositionSizeAfter), IntegerEntry(k_cumulativeNotional, _cumulativeNotionalAfter), IntegerEntry(k_openInteresetNotional, _openInteresetNotional)]
303+
304+
305+func deletePosition (_address) = [DeleteEntry(toCompositeKey(k_positionSize, _address)), DeleteEntry(toCompositeKey(k_positionMargin, _address)), DeleteEntry(toCompositeKey(k_positionOpenNotional, _address)), DeleteEntry(toCompositeKey(k_positionLastUpdatedCumulativePremiumFraction, _address))]
306+
307+
308+func withdraw (_address,_amount) = {
309+ let balance = assetBalance(this, USDN)
310+ if ((_amount > balance))
311+ then throw(((("Unable to withdraw " + toString(_amount)) + " from contract balance ") + toString(balance)))
312+ else [ScriptTransfer(_address, _amount, USDN)]
313+ }
314+
315+
316+func writeConstants () = [StringEntry("ADMIN_ADDRESS", toString(ADMIN_ADDRESS)), StringEntry("USDN", toBase58String(USDN)), StringEntry("USDN_STAKING", toString(USDN_STAKING)), StringEntry("ORACLE", toString(ORACLE))]
317+
318+
319+@Callable(i)
320+func initialize (_quouteAssetReserve,_baseAssetReserve,_fundingPeriod,_initMarginRatio,_maintenanceMarginRatio,_liquidationFeeRatio) = if (if (if (if (if (if (if (if ((0 >= _quouteAssetReserve))
321+ then true
322+ else (0 >= _baseAssetReserve))
323+ then true
324+ else (0 >= _fundingPeriod))
325+ then true
326+ else (0 >= _initMarginRatio))
327+ then true
328+ else (0 >= _maintenanceMarginRatio))
329+ then true
330+ else (0 >= _liquidationFeeRatio))
331+ then true
332+ else (i.caller != ADMIN_ADDRESS))
333+ then true
334+ else initialized())
335+ then throw("Invalid initialize parameters")
336+ else ((((updateAmm(_quouteAssetReserve, _baseAssetReserve, 0, 0, 0, 0) ++ updateSettings(_initMarginRatio, _maintenanceMarginRatio, _liquidationFeeRatio, _fundingPeriod)) ++ updateFunding(0, (lastBlock.timestamp + _fundingPeriod), 0, 0)) ++ writeConstants()) ++ [BooleanEntry(k_initialized, true)])
337+
338+
339+
340+@Callable(i)
341+func decreasePosition (_direction,_amount,_leverage,_minBaseAssetAmount) = if (if (if (if (if (if ((_direction != DIR_LONG))
342+ then (_direction != DIR_SHORT)
343+ else false)
344+ then true
345+ else (0 >= _amount))
346+ then true
347+ else if (((1 * DECIMAL_UNIT) > _leverage))
348+ then true
349+ else (_leverage > (3 * DECIMAL_UNIT)))
350+ then true
351+ else !(initialized()))
352+ then true
353+ else !(requireMoreMarginRatio(divd(DECIMAL_UNIT, _leverage), initMarginRatio(), true)))
354+ then throw("Invalid decreasePosition parameters")
355+ else {
356+ let $t01601416193 = getPosition(toString(i.caller))
357+ let oldPositionSize = $t01601416193._1
358+ let oldPositionMargin = $t01601416193._2
359+ let oldPositionOpenNotional = $t01601416193._3
360+ let oldPositionLastUpdatedCumulativePremiumFraction = $t01601416193._4
361+ let isNewPosition = (oldPositionSize == 0)
362+ let isSameDirection = if ((oldPositionSize > 0))
363+ then (_direction == DIR_LONG)
364+ else (_direction == DIR_SHORT)
365+ let expandExisting = if (!(isNewPosition))
366+ then isSameDirection
367+ else false
368+ let isAdd = (_direction == DIR_LONG)
369+ let $t01648219499 = if (if (isNewPosition)
370+ then true
371+ else expandExisting)
372+ then throw("Use increasePosition to open new or increase position")
373+ else {
374+ let openNotional = muld(_amount, _leverage)
375+ let $t01701017109 = getPositionNotionalAndUnrealizedPnl(toString(i.caller))
376+ let oldPositionNotional = $t01701017109._1
377+ let unrealizedPnl = $t01701017109._2
378+ if ((oldPositionNotional > openNotional))
379+ then {
380+ let $t01717117452 = swapInput(isAdd, openNotional)
381+ let exchangedPositionSize = $t01717117452._1
382+ let quouteAssetReserveAfter = $t01717117452._2
383+ let baseAssetReserveAfter = $t01717117452._3
384+ let baseAssetDeltaThisFundingPeriodAfter = $t01717117452._4
385+ let totalPositionSizeAfter = $t01717117452._5
386+ let cumulativeNotionalAfter = $t01717117452._6
387+ let exchangedPositionSizeAbs = abs(exchangedPositionSize)
388+ if (if ((_minBaseAssetAmount != 0))
389+ then (_minBaseAssetAmount > exchangedPositionSizeAbs)
390+ else false)
391+ then throw(((("Too little basse asset exchanged, got " + toString(exchangedPositionSizeAbs)) + " expected ") + toString(_minBaseAssetAmount)))
392+ else {
393+ let realizedPnl = if ((oldPositionSize != 0))
394+ then divd(muld(unrealizedPnl, exchangedPositionSizeAbs), oldPositionSize)
395+ else 0
396+ let $t01799318313 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLastUpdatedCumulativePremiumFraction, realizedPnl)
397+ let remainMargin = $t01799318313._1
398+ let badDebt = $t01799318313._2
399+ let fundingPayment = $t01799318313._3
400+ let oldLatestCumulativePremiumFraction = $t01799318313._4
401+ let exchangedQuoteAssetAmount = openNotional
402+ let unrealizedPnlAfter = (unrealizedPnl - realizedPnl)
403+ let remainOpenNotional = if ((oldPositionSize > 0))
404+ then ((oldPositionNotional - exchangedQuoteAssetAmount) - unrealizedPnlAfter)
405+ else ((unrealizedPnlAfter + oldPositionNotional) - exchangedQuoteAssetAmount)
406+ $Tuple10((oldPositionSize + exchangedPositionSize), remainMargin, abs(remainOpenNotional), oldLatestCumulativePremiumFraction, baseAssetReserveAfter, quouteAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, (openInteresetNotional() - openNotional))
407+ }
408+ }
409+ else throw("Close position first")
410+ }
411+ let newPositionSize = $t01648219499._1
412+ let newPositionRemainMargin = $t01648219499._2
413+ let newPosiionOpenNotional = $t01648219499._3
414+ let newPositionLatestCumulativePremiumFraction = $t01648219499._4
415+ let baseAssetReserveAfter = $t01648219499._5
416+ let quouteAssetReserveAfter = $t01648219499._6
417+ let baseAssetDeltaThisFundingPeriodAfter = $t01648219499._7
418+ let totalPositionSizeAfter = $t01648219499._8
419+ let cumulativeNotionalAfter = $t01648219499._9
420+ let openInteresetNotionalAfter = $t01648219499._10
421+ (updatePosition(toString(i.caller), newPositionSize, newPositionRemainMargin, newPosiionOpenNotional, newPositionLatestCumulativePremiumFraction) ++ updateAmm(quouteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter))
422+ }
423+
424+
425+
426+@Callable(i)
427+func increasePosition (_direction,_leverage,_minBaseAssetAmount) = {
428+ let _amount = i.payments[0].amount
429+ if (if (if (if (if (if (if ((_direction != DIR_LONG))
430+ then (_direction != DIR_SHORT)
431+ else false)
432+ then true
433+ else (0 >= _amount))
434+ then true
435+ else if (((1 * DECIMAL_UNIT) > _leverage))
436+ then true
437+ else (_leverage > (3 * DECIMAL_UNIT)))
438+ then true
439+ else !(initialized()))
440+ then true
441+ else (i.payments[0].assetId != USDN))
442+ then true
443+ else !(requireMoreMarginRatio(divd(DECIMAL_UNIT, _leverage), initMarginRatio(), true)))
444+ then throw("Invalid increasePosition parameters")
445+ else {
446+ let $t02044220621 = getPosition(toString(i.caller))
447+ let oldPositionSize = $t02044220621._1
448+ let oldPositionMargin = $t02044220621._2
449+ let oldPositionOpenNotional = $t02044220621._3
450+ let oldPositionLastUpdatedCumulativePremiumFraction = $t02044220621._4
451+ let isNewPosition = (oldPositionSize == 0)
452+ let isSameDirection = if ((oldPositionSize > 0))
453+ then (_direction == DIR_LONG)
454+ else (_direction == DIR_SHORT)
455+ let expandExisting = if (!(isNewPosition))
456+ then isSameDirection
457+ else false
458+ let isAdd = (_direction == DIR_LONG)
459+ let $t02091023318 = if (if (isNewPosition)
460+ then true
461+ else expandExisting)
462+ then {
463+ let openNotional = muld(_amount, _leverage)
464+ let $t02135621609 = swapInput(isAdd, openNotional)
465+ let amountBaseAssetBought = $t02135621609._1
466+ let quouteAssetReserveAfter = $t02135621609._2
467+ let baseAssetReserveAfter = $t02135621609._3
468+ let baseAssetDeltaThisFundingPeriodAfter = $t02135621609._4
469+ let totalPositionSizeAfter = $t02135621609._5
470+ let cumulativeNotionalAfter = $t02135621609._6
471+ if (if ((_minBaseAssetAmount != 0))
472+ then (_minBaseAssetAmount > abs(amountBaseAssetBought))
473+ else false)
474+ then throw(((("Limit error: " + toString(abs(amountBaseAssetBought))) + " < ") + toString(_minBaseAssetAmount)))
475+ else {
476+ let newPositionSize = (oldPositionSize + amountBaseAssetBought)
477+ let increaseMarginRequirement = divd(openNotional, _leverage)
478+ let $t02199022292 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLastUpdatedCumulativePremiumFraction, increaseMarginRequirement)
479+ let remainMargin = $t02199022292._1
480+ let x1 = $t02199022292._2
481+ let x2 = $t02199022292._3
482+ let oldLatestCumulativePremiumFraction = $t02199022292._4
483+ $Tuple10(newPositionSize, remainMargin, (oldPositionOpenNotional + openNotional), oldLatestCumulativePremiumFraction, baseAssetReserveAfter, quouteAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, (openInteresetNotional() + openNotional))
484+ }
485+ }
486+ else {
487+ let openNotional = muld(_amount, _leverage)
488+ let $t02302823127 = getPositionNotionalAndUnrealizedPnl(toString(i.caller))
489+ let oldPositionNotional = $t02302823127._1
490+ let unrealizedPnl = $t02302823127._2
491+ if ((oldPositionNotional > openNotional))
492+ then throw("Use decreasePosition to decrease position size")
493+ else throw("Close position first")
494+ }
495+ let newPositionSize = $t02091023318._1
496+ let newPositionRemainMargin = $t02091023318._2
497+ let newPosiionOpenNotional = $t02091023318._3
498+ let newPositionLatestCumulativePremiumFraction = $t02091023318._4
499+ let baseAssetReserveAfter = $t02091023318._5
500+ let quouteAssetReserveAfter = $t02091023318._6
501+ let baseAssetDeltaThisFundingPeriodAfter = $t02091023318._7
502+ let totalPositionSizeAfter = $t02091023318._8
503+ let cumulativeNotionalAfter = $t02091023318._9
504+ let openInteresetNotionalAfter = $t02091023318._10
505+ let stake = invoke(USDN_STAKING, "lockNeutrino", nil, [AttachedPayment(USDN, _amount)])
506+ if ((stake == stake))
507+ then (updatePosition(toString(i.caller), newPositionSize, newPositionRemainMargin, newPosiionOpenNotional, newPositionLatestCumulativePremiumFraction) ++ updateAmm(quouteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter))
508+ else throw("Strict value is not equal to itself.")
509+ }
510+ }
511+
512+
513+
514+@Callable(i)
515+func addMargin () = {
516+ let _amount = i.payments[0].amount
517+ if (if ((i.payments[0].assetId != USDN))
518+ then true
519+ else !(requireOpenPosition(toString(i.caller))))
520+ then throw("Invalid addMargin parameters")
521+ else {
522+ let $t02410224281 = getPosition(toString(i.caller))
523+ let oldPositionSize = $t02410224281._1
524+ let oldPositionMargin = $t02410224281._2
525+ let oldPositionOpenNotional = $t02410224281._3
526+ let oldPositionLastUpdatedCumulativePremiumFraction = $t02410224281._4
527+ let stake = invoke(USDN_STAKING, "lockNeutrino", nil, [AttachedPayment(USDN, _amount)])
528+ if ((stake == stake))
529+ then updatePosition(toString(i.caller), oldPositionSize, (oldPositionMargin + i.payments[0].amount), oldPositionOpenNotional, oldPositionLastUpdatedCumulativePremiumFraction)
530+ else throw("Strict value is not equal to itself.")
531+ }
532+ }
533+
534+
535+
536+@Callable(i)
537+func removeMargin (_amount) = if (if ((0 >= _amount))
538+ then true
539+ else !(requireOpenPosition(toString(i.caller))))
540+ then throw("Invalid removeMargin parameters")
541+ else {
542+ let $t02482125000 = getPosition(toString(i.caller))
543+ let oldPositionSize = $t02482125000._1
544+ let oldPositionMargin = $t02482125000._2
545+ let oldPositionOpenNotional = $t02482125000._3
546+ let oldPositionLastUpdatedCumulativePremiumFraction = $t02482125000._4
547+ let marginDelta = -(_amount)
548+ let $t02503725281 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLastUpdatedCumulativePremiumFraction, marginDelta)
549+ let remainMargin = $t02503725281._1
550+ let badDebt = $t02503725281._2
551+ let x1 = $t02503725281._3
552+ let latestCumulativePremiumFraction1 = $t02503725281._4
553+ if ((badDebt != 0))
554+ then throw("Invalid added margin amount")
555+ else {
556+ let unstake = invoke(USDN_STAKING, "unlockNeutrino", [_amount, toBase58String(USDN)], nil)
557+ if ((unstake == unstake))
558+ then (updatePosition(toString(i.caller), oldPositionSize, remainMargin, oldPositionOpenNotional, latestCumulativePremiumFraction1) ++ withdraw(i.caller, _amount))
559+ else throw("Strict value is not equal to itself.")
560+ }
561+ }
562+
563+
564+
565+@Callable(i)
566+func closePosition () = if (!(requireOpenPosition(toString(i.caller))))
567+ then throw("Invalid closePosition parameters")
568+ else {
569+ let $t02591026268 = internalClosePosition(toString(i.caller))
570+ let x1 = $t02591026268._1
571+ let badDebt = $t02591026268._2
572+ let realizedPnl = $t02591026268._3
573+ let marginToVault = $t02591026268._4
574+ let quoteAssetReserveAfter = $t02591026268._5
575+ let baseAssetReserveAfter = $t02591026268._6
576+ let baseAssetDeltaThisFundingPeriodAfter = $t02591026268._7
577+ let totalPositionSizeAfter = $t02591026268._8
578+ let cumulativeNotionalAfter = $t02591026268._9
579+ let openInteresetNotionalAfter = $t02591026268._10
580+ if ((badDebt > 0))
581+ then throw("Unable to close position with bad debt")
582+ else {
583+ let withdrawAmount = abs(marginToVault)
584+ let unstake = invoke(USDN_STAKING, "unlockNeutrino", [withdrawAmount, toBase58String(USDN)], nil)
585+ if ((unstake == unstake))
586+ then ((deletePosition(toString(i.caller)) ++ updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter)) ++ withdraw(i.caller, withdrawAmount))
587+ else throw("Strict value is not equal to itself.")
588+ }
589+ }
590+
591+
592+
593+@Callable(i)
594+func liquidate (_trader) = if (if (!(requireMoreMarginRatio(getMarginRatio(_trader), maintenanceMarginRatio(), false)))
595+ then true
596+ else !(initialized()))
597+ then throw("Unable to liquidate")
598+ else {
599+ let $t02713827468 = internalClosePosition(_trader)
600+ let x1 = $t02713827468._1
601+ let badDebt = $t02713827468._2
602+ let x2 = $t02713827468._3
603+ let marginToVault = $t02713827468._4
604+ let quoteAssetReserveAfter = $t02713827468._5
605+ let baseAssetReserveAfter = $t02713827468._6
606+ let baseAssetDeltaThisFundingPeriodAfter = $t02713827468._7
607+ let totalPositionSizeAfter = $t02713827468._8
608+ let cumulativeNotionalAfter = $t02713827468._9
609+ let openInteresetNotionalAfter = $t02713827468._10
610+ let exchangedQuoteAssetAmount = $t02713827468._11
611+ let feeToLiquidator = (muld(exchangedQuoteAssetAmount, liquidationFeeRatio()) / 2)
612+ let $t02755827962 = if ((feeToLiquidator > marginToVault))
613+ then $Tuple3((feeToLiquidator - marginToVault), marginToVault, ((badDebt + feeToLiquidator) - marginToVault))
614+ else $Tuple3(0, (marginToVault - feeToLiquidator), badDebt)
615+ let liquidationBadDebt = $t02755827962._1
616+ let remainMargin = $t02755827962._2
617+ let totalBadDebt = $t02755827962._3
618+ ((deletePosition(_trader) ++ updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter)) ++ withdraw(i.caller, feeToLiquidator))
619+ }
620+
621+
622+
623+@Callable(i)
624+func payFunding () = {
625+ let fundingBlockTimestamp = nextFundingBlockTimestamp()
626+ if (if ((fundingBlockTimestamp > lastBlock.timestamp))
627+ then true
628+ else !(initialized()))
629+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(fundingBlockTimestamp)))
630+ else {
631+ let underlyingPrice = getOracleTwapPrice()
632+ let spotTwapPrice = getTwapSpotPrice()
633+ let premium = (spotTwapPrice - underlyingPrice)
634+ let premiumFraction = divd(muld(premium, fundingPeriodDecimal()), ONE_DAY)
635+ let totalTraderPositionSize = totalPositionSize()
636+ let ammFundingPaymentProfit = muld(premiumFraction, totalTraderPositionSize)
637+ updateFunding(0, (fundingBlockTimestamp + fundingPeriodSeconds()), (latestCumulativePremiumFraction() + premiumFraction), divd(premiumFraction, underlyingPrice))
638+ }
639+ }
640+
641+
642+
643+@Callable(i)
644+func view_closePosition () = {
645+ let $t02918629330 = internalClosePosition(toString(i.caller))
646+ let x1 = $t02918629330._1
647+ let x2 = $t02918629330._2
648+ let x3 = $t02918629330._3
649+ let x4 = $t02918629330._4
650+ let x5 = $t02918629330._5
651+ let x6 = $t02918629330._6
652+ let x7 = $t02918629330._7
653+ let x8 = $t02918629330._8
654+ let x9 = $t02918629330._9
655+ let x10 = $t02918629330._10
656+ throw(((((((((((((((((((("1=" + toString(x1)) + " 2=") + toString(x2)) + " 3=") + toString(x3)) + " 4=") + toString(x4)) + " 5=") + toString(x5)) + " 6=") + toString(x6)) + " 7=") + toString(x7)) + " 8=") + toString(x8)) + " 9=") + toString(x9)) + " 10=") + toString(x10)))
657+ }
658+
659+
660+@Verifier(tx)
661+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
662+

github/deemru/w8io/169f3d6 
52.01 ms