tx · HzYeXTtiupnFZBAHDK7JbTPWbaX4BUDyfJM2wfZmKZ4f

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.07200000 Waves

2024.02.13 16:17 [4040300] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "HzYeXTtiupnFZBAHDK7JbTPWbaX4BUDyfJM2wfZmKZ4f", "fee": 7200000, "feeAssetId": null, "timestamp": 1707830006091, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "", "VCMVHzDAMw3EnhnvE33x1ympUie15mXLoHGm1Gn47tZ3fWsDAkVXZfFLn8ZkgUqWnCSZB6Hd7TyTjDBEqg12pdv", "4oefK3vqyNDyFtZHuQNhMTLqs9QQSePuGwC3xfQnVgbew3uvDktFrHZAaNPuQPHuukqG6Pmey6RSryU79X8ymWax" ], "script": "base64:BgKrAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBgoECAEIBBIECgIIARIFCgMIAQgSBgoEAQgIARIFCgMBCAgSDwoNCAgICAgICAgICAgICBIDCgEIEgMKAQgSBQoDCAgBEgYKBAgBCAgSBwoFCAgIAQQSBQoDCAQBEg0KCwgICAEBAQEBAQQEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCJgBAARDT05GCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgZjb25maWcAB1NGX1BPT0wCAlNGAAdXWF9QT09MAgJXWAAEQ1BNTQIEY3BtbQAERkxBVAIEZmxhdAAPQ0FQX0ZFRV9OT19MT0FOAgljYXBOb0xvYW4ADENBUF9GRUVfTE9BTgIHY2FwTG9hbgAUU1RPUExPU1NfRkVFX05PX0xPQU4CDnN0b3BMb3NzTm9Mb2FuAA1TVE9QTE9TU19MT0FOAgxzdG9wTG9zc0xvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZOT19GRUUCBW5vRmVlAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAHU0NBTEUxNgkAtgIBAICAhP6m3uERAApGRUVfU0NBTEU2AMCEPQAUa1NGUG9vbEFBc3NldEJhbGFuY2UCD0FfYXNzZXRfYmFsYW5jZQAUa1NGUG9vbEJBc3NldEJhbGFuY2UCD0JfYXNzZXRfYmFsYW5jZQAPa1NGUG9vbEFBc3NldElkAgpBX2Fzc2V0X2lkAA9rU0ZQb29sQkFzc2V0SWQCCkJfYXNzZXRfaWQADmtTRlBvb2xTaGFyZUlkAg5zaGFyZV9hc3NldF9pZAASa1NGUG9vbFNoYXJlU3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDV91c2VyUG9zaXRpb24AEWtVc2VyUG9zaXRpb25Qb29sAhFfdXNlclBvc2l0aW9uUG9vbAARa1VzZXJCb3Jyb3dBbW91bnQCGV91c2VyUG9zaXRpb25Cb3Jyb3dBbW91bnQAEmtVc2VyQm9ycm93QXNzZXRJZAIaX3VzZXJQb3NpdGlvbkJvcnJvd0Fzc2V0SWQAEGtVc2VyUG9zaXRpb25OdW0CE191c2VyUG9zaXRpb25OdW1iZXIAFWtVc2VyUG9zaXRpb25JbnRlcmVzdAIVX3VzZXJQb3NpdGlvbkludGVyZXN0ABZrVXNlclBvc2l0aW9uSW5QTWFya2V0AhRfdXNlclBvc2l0aW9uUE1hcmtldAAKa1Bvb2xUb3RhbAIKX3Bvb2xUb3RhbAAOa1Bvb2xUb3RhbExvYW4CDl9wb29sVG90YWxMb2FuABBrUG9vbFRvdGFsTWFya2V0AhBfcG9vbFRvdGFsTWFya2V0ABRrUG9vbFRvdGFsTWFya2V0TG9hbgIUX3Bvb2xUb3RhbE1hcmtldExvYW4AEWtQb29sSW50ZXJlc3RMb2FuAhFfcG9vbEludGVyZXN0TG9hbgATa1Bvb2xJbnRlcmVzdE5vTG9hbgITX3Bvb2xJbnRlcmVzdE5vTG9hbgAXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4CF19wb29sSW50ZXJlc3RNYXJrZXRMb2FuABlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAhlfcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAA5rUG9vbENhbkJvcnJvdwIOX3Bvb2xDYW5Cb3Jyb3cADGtQb29sUE1BcmtldAIRX3Bvb2xQdXp6bGVNYXJrZXQAFWtBeGx5SW5GZWVXaXRob3V0TG9hbgIOX2F4bHlGZWVOb0xvYW4AEmtBeGx5SW5GZWVXaXRoTG9hbgIQX2F4bHlGZWVXaXRoTG9hbgARa0F4bHlOb0xvYW5DYXBGZWUCEV9heGx5RmVlQ2FwTm9Mb2FuABNrQXhseVdpdGhMb2FuQ2FwRmVlAhNfYXhseUZlZUNhcFdpdGhMb2FuABZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlAhhfYXhseUZlZVN0b3Bsb3NzV2l0aExvYW4AFGtBeGx5U3RvcExvc3NMb2FuRmVlAhZfYXhseUZlZVN0b3Bsb3NzTm9Mb2FuAAprUmVxdWVzdElkAgtfcmVxdWVzdF9pZAAMa1JlcXVlc3RJdGVyAg1yZXF1ZXN0c19pdGVyAAVrUG9vbAIFcG9vbF8ACWtQb29sVHlwZQIJX3Bvb2xUeXBlAAprU2hhcmVQb29sAgxfcG9vbFNoYXJlSWQADmtQb29sQ2FwQ2hhbmdlAg5fcG9vbENhcENoYW5nZQAPa1Rva2VuTGFzdFByaWNlAgpsYXN0X3ByaWNlAA5rUHJpY2VJbk9yYWNsZQIHX3R3YXA1QgAHa0FjdGl2ZQIGYWN0aXZlAAxrQWN0aXZlVXNlcnMCC2FjdGl2ZVVzZXJzAAtrQWN0aXZlU0ZXWAIHX2FjdGl2ZQALa1Bvb2xBY3RpdmUCC19hY3RpdmVQb29sAA1rVXNlclN0b3BMb3NzAglfc3RvcExvc3MAF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAhdfZmFsbGJhY2tFeGNoYW5nZVN3b3BmaQAOa1Bvb2xQcm94eUFkZHICEV9wb29sUHJveHlBZGRyZXNzAAlrTW9uZXlCb3gCDmF4bHlfbW9uZXlfYm94AA5rU0ZGYXJtaW5nQWRkcgITc3dvcGZpX2Zhcm1pbmdfYWRkcgAMa0xlbmRTZXJ2aWNlAhFsZW5kX3NlcnZpY2VfYWRkcgAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAHa1d4UmVzdAIMd3hfcmVzdF9hZGRyAAdrU3dvcElkAgdzd29wX2lkAAVrV3hJZAIFd3hfaWQADGtQTWFya2V0QWRkcgIVcHV6emxlX21hcmtldF9hZGRyZXNzABBrUE1hcmtldFJlc3RBZGRyAhpwdXp6bGVfbWFya2V0X3Jlc3RfYWRkcmVzcwAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAxQWRtaW4zUEsCFWdyb3VwMV9hZG1pbjNfcHViX2tleQAPa0dyb3VwMkFkbWluMVBLAhVncm91cDJfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDJBZG1pbjJQSwIVZ3JvdXAyX2FkbWluMl9wdWJfa2V5AAhtb25leUJveAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFCWtNb25leUJveAIYTm8gYXhseSBtb25leUJveCBhZGRyZXNzAApleENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgULa0V4Q29udHJhY3QCHE5vIGV4Y2hhbmdlIGNvbnRyYWN0IGFkZHJlc3MAD3ByaWNlT3JhY2xlQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDGtQcmljZU9yYWNsZQIXTm8gcHJpY2Ugb3JhY2xlIGFkZHJlc3MADnd4U3dhcENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa1d4U3dhcENvbnRyYWN0AhJObyB3eCBzd2FwIGFkZHJlc3MABnd4UmVzdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tXeFJlc3QCEk5vIHd4IHJlc3QgYWRkcmVzcwAGU1dPUElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQdrU3dvcElkAgpObyBzd29wIGlkAARXWElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQVrV3hJZAIITm8gd3ggaWQAC3BNYXJrZXRBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1BNYXJrZXRBZGRyAhhObyBwdXp6bGUgbWFya2V0IGFkZHJlc3MAD3BNYXJrZXRSZXN0QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFEGtQTWFya2V0UmVzdEFkZHICHU5vIHB1enpsZSBtYXJrZXQgcmVzdCBhZGRyZXNzAA5ncm91cDFBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa0dyb3VwMUFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMVBLAA5ncm91cDFBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa0dyb3VwMUFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMlBLAA5ncm91cDFBZG1pbjNQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa0dyb3VwMUFkbWluM1BLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluM1BLAA5ncm91cDJBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAA5ncm91cDJBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rT3BlcmF0b3JDYWxsUEsCFENhbid0IGdldCBvcGVyYXRvclBLAQ91bmtub3duUG9vbFR5cGUACQACAQIPV3JvbmcgcG9vbCB0eXBlAQ5nZXRMZW5kU3J2QWRkcgAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQxrTGVuZFNlcnZpY2UCG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgEOaXNPcGVyYXRvckNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwYJAAACCAUBaQZjYWxsZXIFCG1vbmV5Qm94BQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQtpc0FkbWluQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjFQSwYJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMlBLBQR1bml0CQACAQIoT25seSBhZG1pbiBncm91cDEgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgkBDmdldExlbmRTcnZBZGRyAAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQhpc0FjdGl2ZQADCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgYFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50ARBpc0FjdGl2ZUZvclVzZXJzAAMDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGBgcFBHVuaXQJAAIBAilEQXBwIGlzIGluYWN0aXZlIGZvciB1c2VycyBhdCB0aGlzIG1vbWVudAEMaXNQb29sQWN0aXZlAgRwb29sBHR5cGUECldYU0ZBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQR0eXBlBQtrQWN0aXZlU0ZXWAYECnBvb2xBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYDAwUKV1hTRkFjdGl2ZQUKcG9vbEFjdGl2ZQcGBwEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBEWdldFNGUG9vbEJhbGFuY2VzAQhwb29sQWRkcgkAlAoCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xBQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEJBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEIgYXNzZXQgYmFsYW5jZQERZ2V0V1hQb29sQmFsYW5jZXMDCHBvb2xBZGRyA2FJZANiSWQJAJQKAgoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYUlkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2JJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQ9nZXRQb29sQmFsYW5jZXMECHBvb2xBZGRyBHR5cGUDYUlkA2JJZAMJAAACBQR0eXBlBQdTRl9QT09MCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQJAQ91bmtub3duUG9vbFR5cGUAAQ1nZXRTRlBvb2xEYXRhAQhwb29sQWRkcgQLJHQwOTY1NTk3MDQJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFCyR0MDk2NTU5NzA0BQskdDA5NjU1OTcwNAQEYmFsQggFCyR0MDk2NTU5NzA0Al8yBARiYWxBCAULJHQwOTY1NTk3MDQCXzEJAJcKBQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQUFzc2V0SWQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEJBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBQRiYWxBBQRiYWxCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFDmtTRlBvb2xTaGFyZUlkAhhDYW4ndCBnZXQgc2hhcmUgYXNzZXQgaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldFdYUG9vbERhdGEBCHBvb2xBZGRyBANjZmcKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDY2ZnBQNjZmcEA2FJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQEA2JJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABQMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQEB3NoYXJlSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAMDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhpDYW4ndCBnZXQgcG9vbCBMUCBhc3NldCBpZAQNJHQwMTA0MDExMDQ2MAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkAwkAAAIFDSR0MDEwNDAxMTA0NjAFDSR0MDEwNDAxMTA0NjAEBGJhbEIIBQ0kdDAxMDQwMTEwNDYwAl8yBARiYWxBCAUNJHQwMTA0MDExMDQ2MAJfMQkAlwoFBQNhSWQFA2JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0UG9vbERhdGECCHBvb2xBZGRyBHR5cGUDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBDWdldFNGUG9vbERhdGEBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQENZ2V0V1hQb29sRGF0YQEFCHBvb2xBZGRyCQEPdW5rbm93blBvb2xUeXBlAAEOZ2V0U2hhcmVTdXBwbHkDCHBvb2xBZGRyBHR5cGUHc2hhcmVJZAMJAAACBQR0eXBlBQdTRl9QT09MCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFEmtTRlBvb2xTaGFyZVN1cHBseQIcQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IHN1cHBseQMJAAACBQR0eXBlBQdXWF9QT09MCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUHc2hhcmVJZAINV3JvbmcgU2hhcmVJZAhxdWFudGl0eQkBD3Vua25vd25Qb29sVHlwZQABEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQR1c2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4DCQAAAgUHZmVlVHlwZQUGTk9fRkVFAAAJAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDGFzc2V0SWRUb1N0cgEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgxOb3QgQXNzZXQgaWQBDmFzc2V0SWRGcm9tU3RyAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpdGlvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOAQ5nZXRBc3NldHNQcmljZQEIYXNzZXRJZHMKAQlnZXRQcmljZXMCAWEHYXNzZXRJZAQKYXNzZXRQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQkAzQgCBQFhBQphc3NldFByaWNlCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgENZ2V0U2hhcmVQcmljZQEHc2hhcmVJZAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAIgQ2FuJ3QgZmluZCBwb29sIGFkZHIgYnkgc2hhcmUgaWQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDEzNDQ5MTM1MTQJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDYUlkCAUNJHQwMTM0NDkxMzUxNAJfMQQDYklkCAUNJHQwMTM0NDkxMzUxNAJfMgQIYUJhbGFuY2UIBQ0kdDAxMzQ0OTEzNTE0Al8zBAhiQmFsYW5jZQgFDSR0MDEzNDQ5MTM1MTQCXzQEBnByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwEB2RQcmljZUEJAJEDAgUGcHJpY2VzAAAEB2RQcmljZUIJAJEDAgUGcHJpY2VzAAEDAwkAZgIAAAUHZFByaWNlQQYJAGYCAAAFB2RQcmljZUIA////////////AQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ5nZXRTaGFyZVByaWNlcwEIc2hhcmVJZHMKAQlnZXRQcmljZXMCAWEHc2hhcmVJZAkAzQgCBQFhCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQKAAIkbAUIc2hhcmVJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQ5nZXRDdXJzRW50cmllcwQDYUlkA2JJZAdzaGFyZUlkCHdBbW91bnRzBAxhc3NldHNQcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBApzaGFyZVByaWNlCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQEBnByaWNlcwkAzggCCQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAAkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAEJAMwIAgkApAMBBQpzaGFyZVByaWNlBQNuaWwFCHdBbW91bnRzCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tUb2tlbkxhc3RQcmljZQkAuQkCBQZwcmljZXMCASwFA25pbAEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCQVwVHlwZQhwb29sQWRkcgRMUElkBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQEcmVwbAoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAiBjYWxjTFBSZXBsZW5pc2hUd29Ub2tlbnNSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUEcG10QQkAzAgCCQCkAwEFBHBtdEIFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFBHJlcGwFBHJlcGwJAJcKBQoAAUAJAJEDAgUEcmVwbAADAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAAEAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkBDGFzc2V0SWRUb1N0cgEJAJEDAgUEcmVwbAACCgABQAkAkQMCBQRyZXBsAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxNTA3MjE1MzM4CQCUCgIJALUJAgoAAUAJAPwHBAUGd3hSZXN0AiRwb29sRXZhbHVhdGVQdXRCeUFtb3VudEFzc2V0UkVBRE9OTFkJAMwIAgUETFBJZAkAzAgCBQRwbXRBBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fCQC1CQIKAAFACQD8BwQFBnd4UmVzdAIjcG9vbEV2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkJAMwIAgUETFBJZAkAzAgCBQRwbXRCBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFDSR0MDE1MDcyMTUzMzgFDSR0MDE1MDcyMTUzMzgECmV2YWxQdXRJbkIIBQ0kdDAxNTA3MjE1MzM4Al8yBApldmFsUHV0SW5BCAUNJHQwMTUwNzIxNTMzOAJfMQQFbHBJbkEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAEEBWxwSW5CCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgABAwkAZgIFBWxwSW5CBQVscEluQQQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQAICQCXCgUFBHBtdEEFA3BtdAkAZQIFBHBtdEIFA3BtdAUDYklkBQVscEluQgQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgAHCQCXCgUFA3BtdAUEcG10QgkAZQIFBHBtdEEFA3BtdAUDYUlkBQVscEluQQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQcIcG9vbEFkZHIFcFR5cGUEcG10QQNhSWQEcG10QgNiSWQEbHBJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2FJZAUEcG10QQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYklkBQRwbXRCBQNuaWwECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFDmtQb29sUHJveHlBZGRyAgADCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAIJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MAwkAAAIFCXByb3h5QWRkcgIACQD8BwQFCHBvb2xBZGRyAgNwdXQJAMwIAgDAhD0JAMwIAgcFA25pbAUIcGF5bWVudHMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAhR3eFJlcGxlbmlzaFR3b1Rva2VucwkAzAgCCQClCAEFCHBvb2xBZGRyCQDMCAIFBGxwSWQJAMwIAgDAhD0JAMwIAgcFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQUIcG9vbEFkZHIFcFR5cGUDcG10BXBtdElkBGxwSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQVwbXRJZAUDcG10BQNuaWwECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFDmtQb29sUHJveHlBZGRyAgADCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhVyZXBsZW5pc2hXaXRoT25lVG9rZW4JAMwIAgkAzAgCAgEwCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZmMDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFCWtQb29sVHlwZQIEY3BtbQUERkxBVAILcHV0T25lVGtuVjICCXB1dE9uZVRrbgMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgITd3hSZXBsZW5pc2hPbmVUb2tlbgkAzAgCCQClCAEFCHBvb2xBZGRyCQDMCAIFBGxwSWQJAMwIAgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAUEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudA1zdGFrZVRvTWFya2V0BAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQdzaGFyZUlkBQZhbW91bnQFA25pbAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAMFDXN0YWtlVG9NYXJrZXQJAPwHBAULcE1hcmtldEFkZHICBnN1cHBseQUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACD2xvY2tTaGFyZVRva2VucwkAzAgCBQRwb29sCQDMCAIAAAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQIZmFybUFkZHIJARBnZXRXWEZhcm1pbmdBZGRyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhmYXJtQWRkcgIFc3Rha2UFA25pbAUIcGF5bWVudHMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAgl3eFN0YWtlTHAJAMwIAgkApQgBBQhmYXJtQWRkcgUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAUEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudApmcm9tTWFya2V0BAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABA0kdDAxODA3NTE4NzU3AwUKZnJvbU1hcmtldAkAlQoDBQtwTWFya2V0QWRkcgIId2l0aGRyYXcJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQIZmFybUFkZHIJARBnZXRXWEZhcm1pbmdBZGRyAQkBB0FkZHJlc3MBCQDZBAEFBHBvb2wDCQAAAgUJcHJveHlBZGRyAgAJAJUKAwUIZmFybUFkZHICB3Vuc3Rha2UJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAkAlQoDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICC3d4VW5zdGFrZUxwCQDMCAIJAKUIAQUIZmFybUFkZHIJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAkBD3Vua25vd25Qb29sVHlwZQAECGZhcm1BZGRyCAUNJHQwMTgwNzUxODc1NwJfMQQFZk5hbWUIBQ0kdDAxODA3NTE4NzU3Al8yBAZwYXJhbXMIBQ0kdDAxODA3NTE4NzU3Al8zBANpbnYJAPwHBAUIZmFybUFkZHIFBWZOYW1lBQZwYXJhbXMFA25pbAMJAAACBQNpbnYFA2ludgUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFjYWxjQW1vdW50VG9QYXlTRgcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQJZmVlU2NhbGU2AMCEPQQDZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQhwb29sQWRkcgUKa1NGUG9vbEZlZQQMYW1udEdldE5vRmVlCQBuBAUQYW1vdW50VG9rZW5Ub0dldAUJZmVlU2NhbGU2CQBlAgUJZmVlU2NhbGU2BQNmZWUFB0NFSUxJTkcEDSR0MDE5MTc5MTk0ODUDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEIJAGUCBQRiYWxBBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAbgQFDGFtbnRHZXROb0ZlZQUEYmFsQQkAZQIFBGJhbEIFDGFtbnRHZXROb0ZlZQUHQ0VJTElORwkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTkxNzkxOTQ4NQJfMQQKYXNzZXRUb1BheQgFDSR0MDE5MTc5MTk0ODUCXzIJAJQKAgUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkBDWdldFdYU3dhcEZlZXMBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAlmQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgITJXNfX2ZhY3RvcnlDb250cmFjdAIiQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY29udHJhY3QgYWRkcgQOcG9vbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCCyVzX19wb29sRmVlBBJwcm90b2NvbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCDyVzX19wcm90b2NvbEZlZQQHJG1hdGNoMAkA/AcEBQlmQ29udHJhY3QCEmdldFN3YXBGZWVSRUFET05MWQkAzAgCCQClCAEFCHBvb2xBZGRyBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBARmZWVzBQckbWF0Y2gwCQCUCgIIBQRmZWVzAl8xCAUEZmVlcwJfMgkAlAoCBQ5wb29sRmVlRGVmYXVsdAUScHJvdG9jb2xGZWVEZWZhdWx0ARFjYWxjQW1vdW50VG9QYXlXWAcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEDSR0MDIwMjI1MjAyNjQJAQ1nZXRXWFN3YXBGZWVzAQUEcG9vbAQEcEZlZQgFDSR0MDIwMjI1MjAyNjQCXzEEBXByRmVlCAUNJHQwMjAyMjUyMDI2NAJfMgQIZmVlU2NhbGUJALYCAQCAwtcvBA0kdDAyMDMwNDIwNjEyAwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQgkAZQIFBGJhbEEFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEEJAGUCBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAyMDMwNDIwNjEyAl8xBAphc3NldFRvUGF5CAUNJHQwMjAzMDQyMDYxMgJfMgQSYW1vdW50VG9QYXlXaXRoRmVlCQCgAwEJAL0CBAkAtgIBBQthbW91bnRUb1BheQUIZmVlU2NhbGUJALgCAgUIZmVlU2NhbGUJALYCAQkAZAIFBXByRmVlBQRwRmVlBQdDRUlMSU5HCQCUCgIFCmFzc2V0VG9QYXkFEmFtb3VudFRvUGF5V2l0aEZlZQEQZXhjaGFuZ2VEaXJlY3RseQgFcFR5cGUEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgADAwkAAAIFBXBUeXBlBQdTRl9QT09MBgkBAiE9AgUGcG9vbEZCAgAEDSR0MDIxMDUzMjEyNjUDCQAAAgUGcG9vbEZCAgAJAJUKAwUEYmFsQQUEYmFsQgUEcG9vbAQNJHQwMjExNTkyMTIzMgkBEWdldFNGUG9vbEJhbGFuY2VzAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcG9vbEZCBAZzZkJhbEEIBQ0kdDAyMTE1OTIxMjMyAl8xBAZzZkJhbEIIBQ0kdDAyMTE1OTIxMjMyAl8yCQCVCgMFBnNmQmFsQQUGc2ZCYWxCBQZwb29sRkIEBXBCYWxBCAUNJHQwMjEwNTMyMTI2NQJfMQQFcEJhbEIIBQ0kdDAyMTA1MzIxMjY1Al8yBAZleFBvb2wIBQ0kdDAyMTA1MzIxMjY1Al8zBA0kdDAyMTI3MDIxMzk2CQERY2FsY0Ftb3VudFRvUGF5U0YHBQZleFBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUFcEJhbEEFBXBCYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAyMTI3MDIxMzk2Al8xBAthbW91bnRUb1BheQgFDSR0MDIxMjcwMjEzOTYCXzIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtb3VudFRva2VuVG9HZXQFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAyMTU5ODIxNzIwCQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDIxNTk4MjE3MjACXzEEC2Ftb3VudFRvUGF5CAUNJHQwMjE1OTgyMTcyMAJfMgkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCBRBhbW91bnRUb2tlblRvR2V0CQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAkBD3Vua25vd25Qb29sVHlwZQABFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFcFR5cGUEcG9vbA1hbW91bnRUb2tlbkV4DmFzc2V0VG9rZW5Ub0V4D2Fzc2V0VG9rZW5Ub0dldAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQ9hc3NldFRva2VuVG9HZXQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgAEA2ludgMDCQAAAgUFcFR5cGUFB1NGX1BPT0wGCQECIT0CBQZwb29sRkICAAQGZXhQb29sAwkAAAIFBnBvb2xGQgIABQRwb29sBQZwb29sRkIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCAgExBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUOYXNzZXRUb2tlblRvRXgFDWFtb3VudFRva2VuRXgFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCAAEJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQ5hc3NldFRva2VuVG9FeAUNYW1vdW50VG9rZW5FeAUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFD2Fzc2V0VG9rZW5Ub0dldAMJAAACBQhiYWxBZnRlcgUIYmFsQWZ0ZXIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDIyODQ5MjMzMjADCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUGd3hSZXN0Ahdwb29sRXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAyMjg0OTIzMzIwAl8xBAdhbW91bnRCCAUNJHQwMjI4NDkyMzMyMAJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDIzNzYwMjM4MzkJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjM3NjAyMzgzOQJfMQQDYklkCAUNJHQwMjM3NjAyMzgzOQJfMgQEYUJhbAgFDSR0MDIzNzYwMjM4MzkCXzMEBGJCYWwIBQ0kdDAyMzc2MDIzODM5Al80BARscElkCAUNJHQwMjM3NjAyMzgzOQJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBAhmYXJtQWRkcgkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBANpbnYDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIZmFybUFkZHICB2NsYWltV3gJAMwIAgUEbHBJZAUDbmlsBQNuaWwJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAg13eENsYWltRmFybWVkCQDMCAIJAKUIAQUIZmFybUFkZHIJAMwIAgUEbHBJZAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQRXWElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEPcmVwbGVuaXNoQnlUeXBlCwVwVHlwZQRwb29sB2ZlZVR5cGUEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCBExQSWQLc3Rha2VNYXJrZXQED2xwQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkAwkAAAIFD2xwQmFsYW5jZUJlZm9yZQUPbHBCYWxhbmNlQmVmb3JlBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQNJHQwMjQ2NDQyNTA3MgMDCQBmAgUEcG10QQAACQBmAgUEcG10QgAABwQNJHQwMjQ3MTAyNDgzMgkBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFBXBUeXBlBQhwb29sQWRkcgUETFBJZAUEcG10QQUDYUlkBQRwbXRCBQNiSWQFBGJhbEEFBGJhbEIEBnBtdEluQQgFDSR0MDI0NzEwMjQ4MzICXzEEBnBtdEluQggFDSR0MDI0NzEwMjQ4MzICXzIEBmNoYW5nZQgFDSR0MDI0NzEwMjQ4MzICXzMECGNoYW5nZUlkCAUNJHQwMjQ3MTAyNDgzMgJfNAQDaW52CQEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBwUIcG9vbEFkZHIFBXBUeXBlBQZwbXRJbkEFA2FJZAUGcG10SW5CBQNiSWQFBExQSWQDCQAAAgUDaW52BQNpbnYJAJQKAgUGY2hhbmdlBQhjaGFuZ2VJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAGYCBQRwbXRBAAAJAJQKAgUEcG10QQUDYUlkAwkAZgIFBHBtdEIAAAkAlAoCBQRwbXRCBQNiSWQJAAIBAhBwbXRzIG11c3QgYmUgPiAwBAZjaGFuZ2UIBQ0kdDAyNDY0NDI1MDcyAl8xBAhjaGFuZ2VJZAgFDSR0MDI0NjQ0MjUwNzICXzIEA2ludgMJAGYCBQZjaGFuZ2UAAAkBF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBQUIcG9vbEFkZHIFBXBUeXBlBQZjaGFuZ2UFCGNoYW5nZUlkBQRMUElkBQNuaWwDCQAAAgUDaW52BQNpbnYEDmxwQmFsYW5jZUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQEC3RvdGFsU3Rha2VkCQBlAgUObHBCYWxhbmNlQWZ0ZXIFD2xwQmFsYW5jZUJlZm9yZQQNYXhseUZlZUFtb3VudAkAawMFC3RvdGFsU3Rha2VkCQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYEEXVzZXJTaGFyZUZvclN0YWtlCQBlAgULdG90YWxTdGFrZWQFDWF4bHlGZWVBbW91bnQDCQBnAgAABRF1c2VyU2hhcmVGb3JTdGFrZQkAAgECKGFtb3VudCBvZiBzdGFrZWQgc2hhcmV0b2tlbnMgbXVzdCBiZSA+IDAEBWludkxQCQEHc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQRMUElkBRF1c2VyU2hhcmVGb3JTdGFrZQULc3Rha2VNYXJrZXQDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCQRwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbg1zdGFrZVRvTWFya2V0BAt0b3RhbEFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQPdG90YWxBbW91bnRMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsQW1vdW50TWFya2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBV0b3RhbEFtb3VudE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAABBJwb29sSW50ZXJlc3ROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAEEHBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAAAEFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAABA0kdDAyNjUzMzI3MzU4AwUId2l0aExvYW4DBQ1zdGFrZVRvTWFya2V0CQCUCgIFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsQW1vdW50TWFya2V0BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGQCBRV0b3RhbEFtb3VudE1hcmtldExvYW4FDHN0YWtlZEFtb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BgUDbmlsCQCUCgIFEHBvb2xJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBQ90b3RhbEFtb3VudExvYW4FDHN0YWtlZEFtb3VudAUDbmlsAwUNc3Rha2VUb01hcmtldAkAlAoCBRhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsQW1vdW50TWFya2V0BQxzdGFrZWRBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAYFA25pbAkAlAoCBRJwb29sSW50ZXJlc3ROb0xvYW4FA25pbAQPY3VyUG9vbEludGVyZXN0CAUNJHQwMjY1MzMyNzM1OAJfMQQHYWRFbnRyeQgFDSR0MDI2NTMzMjczNTgCXzIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwFB2FkRW50cnkBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQkEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50A0FJZANCSWQEYmFsQQRiYWxCB3NoYXJlSWQDAwkBAiE9AgUHdG9rZW5JZAUDQUlkCQECIT0CBQd0b2tlbklkBQNCSWQHCQACAQILV3JvbmcgYXNzZXQEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wDCQAAAgUQdG90YWxTaGFyZUFtb3VudAAACQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAAABBh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRF0b3RhbE1hcmtldEFtb3VudAQQdG9rZW5zRm9yRmVlTG9hbgkAawMFC3Rva2VuQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BBJ0b2tlbnNGb3JGZWVOb0xvYW4JAGUCBQt0b2tlbkFtb3VudAUQdG9rZW5zRm9yRmVlTG9hbgQLYXhseUZlZUxvYW4JAGsDBRB0b2tlbnNGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQNYXhseUZlZU5vTG9hbgkAawMFEnRva2Vuc0ZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEB2F4bHlGZWUJAGQCBQtheGx5RmVlTG9hbgUNYXhseUZlZU5vTG9hbgQNJHQwMzAyNzUzMDM3NQMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlAAAJAJQKAgAACQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUEBHBtdEEIBQ0kdDAzMDI3NTMwMzc1Al8xBARwbXRCCAUNJHQwMzAyNzUzMDM3NQJfMgQNJHQwMzAzNzgzMDQ4OQkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQZOT19GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBwQMc3Rha2VkQW1vdW50CAUNJHQwMzAzNzgzMDQ4OQJfMQQCbmYIBQ0kdDAzMDM3ODMwNDg5Al8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQpzdGFrZWRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQdheGx5RmVlCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlbklkBQNuaWwFDHN0YWtlZEFtb3VudAEWY2FwaXRhbGl6ZVB1enpsZU1hcmtldAMEcG9vbAVwVHlwZQdzaGFyZUlkBBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA1tYXJrZXRCYWxhbmNlCQDwBwIFC3BNYXJrZXRBZGRyCQDZBAEFB3NoYXJlSWQDCQAAAgUNbWFya2V0QmFsYW5jZQUNbWFya2V0QmFsYW5jZQQPbWFya2V0QXZhaWxhYmxlCgABQAkA/AcEBQ9wTWFya2V0UmVzdEFkZHICHGFzc2V0U3VwcGx5QnlBZGRyZXNzUkVBRE9OTFkJAMwIAgkApQgBBQtwTWFya2V0QWRkcgkAzAgCBQdzaGFyZUlkCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFD21hcmtldEF2YWlsYWJsZQUPbWFya2V0QXZhaWxhYmxlBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAADAwkAAAIFEXRvdGFsTWFya2V0QW1vdW50AAAJAGYCBQ9tYXJrZXRBdmFpbGFibGUAAAcEDnVuc3Rha2VkQW1vdW50CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD21hcmtldEF2YWlsYWJsZQYDCQAAAgUOdW5zdGFrZWRBbW91bnQFDnVuc3Rha2VkQW1vdW50AwkAZgIFDW1hcmtldEJhbGFuY2UFDnVuc3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDnVuc3Rha2VkQW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAAACQCUCgIFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAljYXBBbW91bnQJAGUCBQ9tYXJrZXRBdmFpbGFibGUFEXRvdGFsTWFya2V0QW1vdW50AwkAZwIAAAUJY2FwQW1vdW50CQCUCgIFA25pbAAABBFtYXJrZXRMb2FuUGVyY2VudAkAawMFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FBlNDQUxFOAURdG90YWxNYXJrZXRBbW91bnQEFnRva2Vuc01hcmtldEZvckZlZUxvYW4JAGsDBQljYXBBbW91bnQFEW1hcmtldExvYW5QZXJjZW50BQZTQ0FMRTgEG3Rva2Vuc01hcmtldEZvckZvckZlZU5vTG9hbgkAZQIFCWNhcEFtb3VudAUWdG9rZW5zTWFya2V0Rm9yRmVlTG9hbgQRYXhseU1hcmtldEZlZUxvYW4JAGsDBRZ0b2tlbnNNYXJrZXRGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQTYXhseU1hcmtldEZlZU5vTG9hbgkAawMFG3Rva2Vuc01hcmtldEZvckZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlNYXJrZXRGZWUJAGQCBRFheGx5TWFya2V0RmVlTG9hbgUTYXhseU1hcmtldEZlZU5vTG9hbgMJAGYCBQ1heGx5TWFya2V0RmVlBQ1tYXJrZXRCYWxhbmNlCQCUCgIFA25pbAAABBJzdGFrZWRNYXJrZXRBbW91bnQJAGUCBQljYXBBbW91bnQFDWF4bHlNYXJrZXRGZWUEEHN0YWtlZE1hcmtldExvYW4JAGsDBRJzdGFrZWRNYXJrZXRBbW91bnQFEW1hcmtldExvYW5QZXJjZW50BQZTQ0FMRTgEEnN0YWtlZE1hcmtldE5vTG9hbgkAZQIFEnN0YWtlZE1hcmtldEFtb3VudAUQc3Rha2VkTWFya2V0TG9hbgQZY3VyUG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEG2N1clBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQVbmV3SW50ZXJlc3RNYXJrZXRMb2FuAwkAZgIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAkAZAIFGWN1clBvb2xJbnRlcmVzdE1hcmtldExvYW4JAGsDBRBzdGFrZWRNYXJrZXRMb2FuBQdTQ0FMRTEwBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAEF25ld0ludGVyZXN0TWFya2V0Tm9Mb2FuAwkAZgIJAGUCBRF0b3RhbE1hcmtldEFtb3VudAUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgAACQBkAgUbY3VyUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQBrAwUSc3Rha2VkTWFya2V0Tm9Mb2FuBQdTQ0FMRTEwCQBlAgURdG90YWxNYXJrZXRBbW91bnQFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAQOdW5zdGFrZWRBbW91bnQJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUNYXhseU1hcmtldEZlZQYDCQAAAgUOdW5zdGFrZWRBbW91bnQFDnVuc3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4FFW5ld0ludGVyZXN0TWFya2V0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuBRduZXdJbnRlcmVzdE1hcmtldE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBkAgURdG90YWxNYXJrZXRBbW91bnQFEnN0YWtlZE1hcmtldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgkAZAIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FEHN0YWtlZE1hcmtldExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlNYXJrZXRGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFA25pbAUSc3Rha2VkTWFya2V0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBHVzZXIEcG9vbAVwb3NJZAhib3Jyb3dlZAtpc01hcmtldFBvcwQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQMdXNlckludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAQScG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABBBwb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAQMcG9vbEludGVyZXN0AwUIYm9ycm93ZWQDBQtpc01hcmtldFBvcwUWcG9vbEludGVyZXN0TWFya2V0TG9hbgUQcG9vbEludGVyZXN0TG9hbgMFC2lzTWFya2V0UG9zBRhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4FEnBvb2xJbnRlcmVzdE5vTG9hbgkAZAIFB3BBbW91bnQJAGsDBQdwQW1vdW50CQBlAgUMcG9vbEludGVyZXN0BQx1c2VySW50ZXJlc3QFB1NDQUxFMTABD2NhbGNTdG9wTG9zc0ZlZQQEcG9vbAppc0JvcnJvd2VkCHN0b3BMb3NzCmxwV2l0aGRyYXcEB2ZlZVR5cGUDBQppc0JvcnJvd2VkBQ1TVE9QTE9TU19MT0FOBRRTVE9QTE9TU19GRUVfTk9fTE9BTgMFCHN0b3BMb3NzCQBrAwUKbHBXaXRoZHJhdwkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2AAABDndpdGhkcmF3VG9Vc2VyBQR1c2VyBHBvb2wFcG9zSWQIc3RvcExvc3MNd2l0aGRyYXdUb2tlbgQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQKZnJvbU1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQFCmZyb21NYXJrZXQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAABAh1c2VyQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHVzZXIECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDM2NTQwMzY2MTIJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQGaWRBU3RyCAUNJHQwMzY1NDAzNjYxMgJfMQQGaWRCU3RyCAUNJHQwMzY1NDAzNjYxMgJfMgQEYmFsQQgFDSR0MDM2NTQwMzY2MTICXzMEBGJhbEIIBQ0kdDAzNjU0MDM2NjEyAl80BAdzaGFyZUlkCAUNJHQwMzY1NDAzNjYxMgJfNQQNJHQwMzY2MTUzNjY4MgkAlAoCCQEOYXNzZXRJZEZyb21TdHIBBQZpZEFTdHIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQlN0cgQDaWRBCAUNJHQwMzY2MTUzNjY4MgJfMQQDaWRCCAUNJHQwMzY2MTUzNjY4MgJfMgQLc3RvcExvc3NGZWUJAQ9jYWxjU3RvcExvc3NGZWUEBQRwb29sBQppc0JvcnJvd2VkBQhzdG9wTG9zcwUPdXNlckNhbldpdGhkcmF3BAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABAtjQmFsQUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFC2NCYWxBQmVmb3JlBQtjQmFsQUJlZm9yZQQLY0JhbEJCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQtjQmFsQkJlZm9yZQULY0JhbEJCZWZvcmUEA2ludgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFC3N0b3BMb3NzRmVlBQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52CQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEJAGUCBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlBQNuaWwFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAZAIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFCmZyb21NYXJrZXQDCQAAAgUDaW52BQNpbnYDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIcG9vbEFkZHICA2dldAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICE3d4V2l0aGRyYXdUd29Ub2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZpZEFTdHIJAMwIAgUGaWRCU3RyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAzNzY5MDM3Nzc5CQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMzc2OTAzNzc3OQJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDM3NjkwMzc3NzkCXzIEDSR0MDM3NzgyMzkwMTgDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAzNzc4MjM5MDE4Al8xBAd0b1VzZXJCCAUNJHQwMzc3ODIzOTAxOAJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBBZwb29sVG90YWxNYXJrZXRFbnRyaWVzAwUKZnJvbU1hcmtldAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQJAGUCBRF0b3RhbE1hcmtldEFtb3VudAUPdXNlckNhbldpdGhkcmF3BQNuaWwDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuCQBlAgUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsBA0kdDAzOTQzMTM5ODI2AwMJAAACBQ13aXRoZHJhd1Rva2VuBQZpZEFTdHIJAGYCBQd0b1VzZXJCAAAHBAZhbXRHZXQJARVleGNoYW5nZURpcmVjdGx5Tm9MaW0FBQVwVHlwZQUEcG9vbAUHdG9Vc2VyQgUGaWRCU3RyBQZpZEFTdHIDCQAAAgUGYW10R2V0BQZhbXRHZXQJAJQKAgkAZAIFB3RvVXNlckEFBmFtdEdldAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwMJAAACBQ13aXRoZHJhd1Rva2VuBQZpZEJTdHIJAGYCBQd0b1VzZXJBAAAHBAZhbXRHZXQJARVleGNoYW5nZURpcmVjdGx5Tm9MaW0FBQVwVHlwZQUEcG9vbAUHdG9Vc2VyQQUGaWRBU3RyBQZpZEJTdHIDCQAAAgUGYW10R2V0BQZhbXRHZXQJAJQKAgAACQBkAgUHdG9Vc2VyQgUGYW10R2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFB3RvVXNlckEFB3RvVXNlckIEC3RvVXNlckFDYWxjCAUNJHQwMzk0MzEzOTgyNgJfMQQLdG9Vc2VyQkNhbGMIBQ0kdDAzOTQzMTM5ODI2Al8yBAdlbnRyaWVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFC3RvVXNlckFDYWxjBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFC3RvVXNlckJDYWxjBQNpZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3N0b3BMb3NzRmVlCQDZBAEFB3NoYXJlSWQFA25pbAUUcG9vbFRvdGFsTG9hbkVudHJpZXMFFnBvb2xUb3RhbE1hcmtldEVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwJAJQKAgUHZW50cmllcwkAzAgCBQt0b1VzZXJBQ2FsYwkAzAgCBQt0b1VzZXJCQ2FsYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxsaXF1aWRhdGVQb3MEBmNhbGxlcgR1c2VyBXBvc0lkB2xBbW91bnQEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AhxUaGVyZSBhcmUgbm8gYm9ycm93IHBvc2l0aW9uBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBXBvc0lkBgUKZnJvbU1hcmtldAQOcG9vbFRvdGFsU2hhcmUJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEEnBvb2xUb3RhbFNoYXJlTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAAECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNDE3NTE0MTgyMwkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDA0MTc1MTQxODIzAl8xBAZpZEJTdHIIBQ0kdDA0MTc1MTQxODIzAl8yBARiYWxBCAUNJHQwNDE3NTE0MTgyMwJfMwQEYmFsQggFDSR0MDQxNzUxNDE4MjMCXzQEB3NoYXJlSWQIBQ0kdDA0MTc1MTQxODIzAl81BA0kdDA0MTgyNjQxODkzCQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDA0MTgyNjQxODkzAl8xBANpZEIIBQ0kdDA0MTgyNjQxODkzAl8yBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEEHBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUKZnJvbU1hcmtldAMJAAACBQNpbnYFA2ludgMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgITd3hXaXRoZHJhd1R3b1Rva2VucwkAzAgCBQRwb29sCQDMCAIFBmlkQVN0cgkAzAgCBQZpZEJTdHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAwkAAAIFA2ludgUDaW52BApjQmFsQUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgUKY0JhbEFBZnRlcgUKY0JhbEFBZnRlcgQKY0JhbEJBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFCmNCYWxCQWZ0ZXIFCmNCYWxCQWZ0ZXIEDSR0MDQzMDc3NDMxNjYJAJQKAgkAZQIFCmNCYWxBQWZ0ZXIFC2NCYWxBQmVmb3JlCQBlAgUKY0JhbEJBZnRlcgULY0JhbEJCZWZvcmUEDXRva2Vuc0Ftb3VudEEIBQ0kdDA0MzA3NzQzMTY2Al8xBA10b2tlbnNBbW91bnRCCAUNJHQwNDMwNzc0MzE2NgJfMgQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFB2xBbW91bnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFB2xBbW91bnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEDSR0MDQzNjcyNDM4OTkDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAlAoCCQBlAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUFB2xBbW91bnQJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlCQCUCgIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlCQBlAgkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUFB2xBbW91bnQEB3RvVXNlckEIBQ0kdDA0MzY3MjQzODk5Al8xBAd0b1VzZXJCCAUNJHQwNDM2NzI0Mzg5OQJfMgQNJHQwNDM5MDI0Mzk3OQkBD2dldFBvb2xCYWxhbmNlcwQFCHBvb2xBZGRyBQVwVHlwZQUGaWRBU3RyBQZpZEJTdHIECWJhbEFBZnRlcggFDSR0MDQzOTAyNDM5NzkCXzEECWJhbEJBZnRlcggFDSR0MDQzOTAyNDM5NzkCXzIEDSR0MDQzOTgyNDQxMTMJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQd0b1VzZXJBBQZpZEFTdHIFB3RvVXNlckIFBmlkQlN0cgUEYmFsQQUEYmFsQgUHc2hhcmVJZAUKZnJvbU1hcmtldAQKdXNlclN0YWtlZAgFDSR0MDQzOTgyNDQxMTMCXzEEB2F4bHlGZWUIBQ0kdDA0Mzk4MjQ0MTEzAl8yBA91c2VyTHBMaXF1ZGF0ZWQJAGUCBQ91c2VyQ2FuV2l0aGRyYXcFCnVzZXJTdGFrZWQEDSR0MDQ0MTcyNDQ1MTcDBQpmcm9tTWFya2V0CQCUCgIFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGUCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQ91c2VyTHBMaXF1ZGF0ZWQFA25pbAkAlAoCBRBwb29sSW50ZXJlc3RMb2FuBQNuaWwED2N1clBvb2xJbnRlcmVzdAgFDSR0MDQ0MTcyNDQ1MTcCXzEEFnBvb2xUb3RhbE1hcmtldEVudHJpZXMIBQ0kdDA0NDE3MjQ0NTE3Al8yCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckxwTGlxdWRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAZQIFB3BBbW91bnQFD3VzZXJMcExpcXVkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QFD2N1clBvb2xJbnRlcmVzdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB2xBbW91bnQJAQ5hc3NldElkRnJvbVN0cgEFC2JvcnJvd0Fzc2V0BQNuaWwFFnBvb2xUb3RhbE1hcmtldEVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwFD3VzZXJMcExpcXVkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKBA1zdGFrZVRvTWFya2V0CQAAAgkAkQMCBQdyZXF1ZXN0AAsCBHRydWUJAJ4KDAUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50BQ1zdGFrZVRvTWFya2V0ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDA0NjI0NTQ2MzQyAwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDA0NjI0NTQ2MzQyAl8xBAtib3Jyb3dEZWNQcggFDSR0MDQ2MjQ1NDYzNDICXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbQZhbW91bnQGY2hhbmdlBA0kdDA0NzM0MjQ4MDIyAwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAQMcHJveHlBZGRyU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQDaW52AwkBAiE9AgUMcHJveHlBZGRyU3RyAgAECXByb3h5QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHJveHlBZGRyU3RyBAxwcm94eUJhbGFuY2UJAPAHAgUJcHJveHlBZGRyBQRXWElEAwkAZgIFDHByb3h5QmFsYW5jZQAACQD8BwQFCXByb3h5QWRkcgIQd3hDbGFpbUZpbmFsaXplZAkAzAgCBQxwcm94eUJhbGFuY2UFA25pbAUDbmlsBQR1bml0BQR1bml0AwkAAAIFA2ludgUDaW52BQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAkAlAoCBQZhbW91bnQFDGNsYWltZWRBc3NldAMJAAACBQ0kdDA0NzM0MjQ4MDIyBQ0kdDA0NzM0MjQ4MDIyBApjbGFpbUFzc2V0CAUNJHQwNDczNDI0ODAyMgJfMgQLY2xhaW1BbW91bnQIBQ0kdDA0NzM0MjQ4MDIyAl8xBANiYWwJAQ5hY2NvdW50QmFsYW5jZQEFCmNsYWltQXNzZXQDCQAAAgUDYmFsBQNiYWwDCQBmAgUGYW1vdW50BQNiYWwJAAIBAhlUbyBiaWcgYW1vdW50IHRvIGV4Y2hhbmdlCQCUCgIFC2NsYWltQW1vdW50BQpjbGFpbUFzc2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuHAFpARNnZXRQb29sSW5mb1JFQURPTkxZAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDQ4Mzg5NDg0NzkJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNDgzODk0ODQ3OQJfMQQDQklkCAUNJHQwNDgzODk0ODQ3OQJfMgQEYmFsQQgFDSR0MDQ4Mzg5NDg0NzkCXzMEBGJhbEIIBQ0kdDA0ODM4OTQ4NDc5Al80BAdzaGFyZUlkCAUNJHQwNDgzODk0ODQ3OQJfNQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAkAlAoCBQNuaWwJAJgKBgUDQUlkBQNCSWQFB3NoYXJlSWQFBGJhbEEFBGJhbEIFC3NoYXJlU3VwcGx5AWkBGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZAQdzaGFyZUlkBAtzaGFyZVByaWNlcwkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCQCUCgIFA25pbAULc2hhcmVQcmljZXMBaQEiZ2V0VXNlclBvc2l0aW9uU2hhcmVBbW91bnRSRUFET05MWQIEdXNlcgZwb3NOdW0EBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sAhBVbmtub3duIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBQR1c2VyBQRwb29sBQZwb3NOdW0JAGYCBQxib3Jyb3dBbW91bnQAAAUKZnJvbU1hcmtldAkAlAoCBQNuaWwFD3VzZXJDYW5XaXRoZHJhdwFpARdnZXRVc2VyUG9zaXRpb25SRUFET05MWQMEdXNlcgVwb29scwZwb3NOdW0KAQd1c2VyUG9zAgFhBHBvb2wEDSR0MDQ5NDc3NDk1NDcFAWEECXdBbW91bnRzQQgFDSR0MDQ5NDc3NDk1NDcCXzEECXdBbW91bnRzQggFDSR0MDQ5NDc3NDk1NDcCXzIEBWRlYnRzCAUNJHQwNDk0Nzc0OTU0NwJfMwQLZXFXQW1vdW50c0EIBQ0kdDA0OTQ3NzQ5NTQ3Al80BAtlcVdBbW91bnRzQggFDSR0MDQ5NDc3NDk1NDcCXzUEBWluZGV4CAUNJHQwNDk0Nzc0OTU0NwJfNgMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUNa1VzZXJQb3NpdGlvbgkAmAoGCQDNCAIFCXdBbW91bnRzQQAACQDNCAIFCXdBbW91bnRzQgAACQDNCAIFBWRlYnRzAAAJAM0IAgULZXFXQW1vdW50c0EAAAkAzQgCBQtlcVdBbW91bnRzQgAACQBkAgUFaW5kZXgAAQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDQ5ODI2NDk5MTYJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNDk4MjY0OTkxNgJfMQQDQklkCAUNJHQwNDk4MjY0OTkxNgJfMgQEYmFsQQgFDSR0MDQ5ODI2NDk5MTYCXzMEBGJhbEIIBQ0kdDA0OTgyNjQ5OTE2Al80BAdzaGFyZUlkCAUNJHQwNDk4MjY0OTkxNgJfNQQMYm9ycm93QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEWtVc2VyQm9ycm93QW1vdW50AAAECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wJAJEDAgUGcG9zTnVtBQVpbmRleAkAZgIFDGJvcnJvd0Ftb3VudAAABQpmcm9tTWFya2V0BA0kdDA1MDI2NjUwMzg2CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwQId0Ftb3VudEEIBQ0kdDA1MDI2NjUwMzg2Al8xBAh3QW1vdW50QggFDSR0MDUwMjY2NTAzODYCXzIDCQBmAgUMYm9ycm93QW1vdW50AAAEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4CQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAZgIFBGRlYnQFCHdBbW91bnRBBwkAZQIFBGRlYnQFCHdBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUDQklkCQBmAgUEZGVidAUId0Ftb3VudEIHCQBlAgUEZGVidAUId0Ftb3VudEIAAAQLYW1vdW50VG9QYXkDCQBmAgUNYW1vdW50VG9HZXRFeAAAAwkAAAIFBXBUeXBlBQdTRl9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVNGBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgkBD3Vua25vd25Qb29sVHlwZQAAAAQNJHQwNTEyOTg1MTUxNwMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQCUCgIJAGUCCQBkAgUId0Ftb3VudEEFDWFtb3VudFRvR2V0RXgFBGRlYnQJAGUCBQh3QW1vdW50QgULYW1vdW50VG9QYXkJAJQKAgkAZQIFCHdBbW91bnRBBQthbW91bnRUb1BheQkAZQIJAGQCBQh3QW1vdW50QgUNYW1vdW50VG9HZXRFeAUEZGVidAQKZXFXQW1vdW50QQgFDSR0MDUxMjk4NTE1MTcCXzEECmVxV0Ftb3VudEIIBQ0kdDA1MTI5ODUxNTE3Al8yCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQDNCAIFBWRlYnRzBQRkZWJ0CQDNCAIFC2VxV0Ftb3VudHNBBQplcVdBbW91bnRBCQDNCAIFC2VxV0Ftb3VudHNCBQplcVdBbW91bnRCCQBkAgUFaW5kZXgAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgUFZGVidHMJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQBkAgUFaW5kZXgAAQQNJHQwNTE3NzI1MTg4MwoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJgKBgUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHdXNlclBvcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAl3QW1vdW50c0EIBQ0kdDA1MTc3MjUxODgzAl8xBAl3QW1vdW50c0IIBQ0kdDA1MTc3MjUxODgzAl8yBAVkZWJ0cwgFDSR0MDUxNzcyNTE4ODMCXzMEC2VxV0Ftb3VudHNBCAUNJHQwNTE3NzI1MTg4MwJfNAQLZXFXQW1vdW50c0IIBQ0kdDA1MTc3MjUxODgzAl81CQCUCgIFA25pbAkAlwoFBQl3QW1vdW50c0EFCXdBbW91bnRzQgUFZGVidHMFC2VxV0Ftb3VudHNBBQtlcVdBbW91bnRzQgFpAQlyZXBsZW5pc2gEBHBvb2wIbGV2ZXJhZ2UIYm9ycm93SWQNc3Rha2VUb01hcmtldAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwMJAGYCAGQFCGxldmVyYWdlBgkAZgIFCGxldmVyYWdlAKwCCQACAQIfTGV2ZXJhZ2UgY2FuJ3QgYmUgPDEwMCBhbmQgPjMwMAMDCQEBIQEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYW5Cb3Jyb3cJAGYCBQhsZXZlcmFnZQBkBwkAAgECHVlvdSBjYW4ndCBib3Jyb3cgaW4gdGhpcyBwb29sAwMFDXN0YWtlVG9NYXJrZXQJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFDGtQb29sUE1BcmtldAcHCQACAQImVGhpcyBwb29sIGNhbid0IHN0YWtlIHRvIHB1enpsZSBtYXJrZXQEDSR0MDUyNjQyNTI3MzIJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNTI2NDI1MjczMgJfMQQDQklkCAUNJHQwNTI2NDI1MjczMgJfMgQEYmFsQQgFDSR0MDUyNjQyNTI3MzICXzMEBGJhbEIIBQ0kdDA1MjY0MjUyNzMyAl80BAdzaGFyZUlkCAUNJHQwNTI2NDI1MjczMgJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwNTI4MTM1Mjg3MgkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDUyODEzNTI4NzICXzEEBHBtdEIIBQ0kdDA1MjgxMzUyODcyAl8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50CQDMCAIJAKUDAQUNc3Rha2VUb01hcmtldAUDbmlsAgEsBAxuZXdSZXF1ZXN0SWQKAAFACQD8BwQFBHRoaXMCEGNyZWF0ZU5ld1JlcXVlc3QJAMwIAgUHcmVxdWVzdAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDG5ld1JlcXVlc3RJZAUMbmV3UmVxdWVzdElkBARhcmdzCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIFDGJvcnJvd0Ftb3VudAkAzAgCCQClCAEFBHRoaXMJAMwIAgIRcmVwbGVuaXNoRnJvbUxhbmQJAMwIAgkApAMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDG5ld1JlcXVlc3RJZAIYQ2FuJ3QgY3JlYXRlIG5ldyByZXF1ZXN0BQNuaWwEA2ludgkA/QcECQEOZ2V0TGVuZFNydkFkZHIAAg1mbGFzaFBvc2l0aW9uBQRhcmdzBQNuaWwDCQAAAgUDaW52BQNpbnYECnVzZXJTdGFrZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQUNa1VzZXJQb3NpdGlvbgQNJHQwNTM4OTU1Mzk4OQkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwNTM4OTU1Mzk4OQUNJHQwNTM4OTU1Mzk4OQQHbmV3QmFsQggFDSR0MDUzODk1NTM5ODkCXzIEB25ld0JhbEEIBQ0kdDA1Mzg5NTUzOTg5Al8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDU0MDU5NTQxNzQJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA1NDA1OTU0MTc0Al8xBAh3QW1vdW50QggFDSR0MDU0MDU5NTQxNzQCXzIJAJQKAgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDU0MjI3NTQzNTcJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQ1zdGFrZVRvTWFya2V0AwkAAAIFDSR0MDU0MjI3NTQzNTcFDSR0MDU0MjI3NTQzNTcEB2F4bHlGZWUIBQ0kdDA1NDIyNzU0MzU3Al8yBAp1c2VyU3Rha2VkCAUNJHQwNTQyMjc1NDM1NwJfMQQNJHQwNTQzNjM1NDQ1NwkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwNTQzNjM1NDQ1NwUNJHQwNTQzNjM1NDQ1NwQHbmV3QmFsQggFDSR0MDU0MzYzNTQ0NTcCXzIEB25ld0JhbEEIBQ0kdDA1NDM2MzU0NDU3Al8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDU0NTI3NTQ2NDIJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA1NDUyNzU0NjQyAl8xBAh3QW1vdW50QggFDSR0MDU0NTI3NTQ2NDICXzIJAJQKAgkAzggCCQEQcmVwbGVuaXNoRW50cmllcwkFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFCW5ld1Bvc051bQUHc2hhcmVJZAUFcFR5cGUHBQ1zdGFrZVRvTWFya2V0CQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgUJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwIAAWkBEHdpdGhkcmF3T25lVG9rZW4DBHBvb2wFcG9zSWQHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50CQEOd2l0aGRyYXdUb1VzZXIFCQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAcFB3Rva2VuSWQBaQEUY3JlYXRlVXBkYXRlU3RvcExvc3MEBXBvc0lkBnBvb2xJZAdhc3NldElkBXByaWNlCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZwb29sSWQCAV8JAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQACAQIaVGhlcmUgYXJlIG5vIHVzZXIgcG9zaXRpb24DCQBnAgAABQVwcmljZQkAAgECHFByaWNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgUFcHJpY2UFEHRva2VuT3JhY2xlUHJpY2UJAAIBAitQcmljZSBtdXN0IGJlIGxlc3MgdGhhbiBjdXJyZW50IHRva2VuIHByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFBXByaWNlBQNuaWwBaQEOZGVsZXRlU3RvcExvc3MDBXBvc0lkBnBvb2xJZAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MJAAIBAghObyBlbnRyeQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFA25pbAFpAQRpbml0DQxtb25leUJveEFkZHINc2ZGYXJtaW5nQWRkcghsZW5kQWRkcg9wcmljZU9yYWNsZUFkZHIQa2VlcGVyRXhDb250cmFjdA53eFN3YXBDb250cmFjdAtzd29wQXNzZXRJZAl3eEFzc2V0SWQOb3BlcmF0b3JQdWJLZXkSZ3JvdXAxQWRtaW4xUHViS2V5Emdyb3VwMUFkbWluMlB1YktleRJncm91cDJBZG1pbjFQdWJLZXkSZ3JvdXAyQWRtaW4yUHViS2V5CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAoggBBQ9rT3BlcmF0b3JDYWxsUEsJAAIBAg5BbHJlYWR5IGluaXRlZAMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUMbW9uZXlCb3hBZGRyCQACAQIjbW9uZXlCb3hBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDXNmRmFybWluZ0FkZHIJAAIBAiRzZkZhcm1pbmdBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFCGxlbmRBZGRyCQACAQIfbGVuZEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUPcHJpY2VPcmFjbGVBZGRyCQACAQImcHJpY2VPcmFjbGVBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFEGtlZXBlckV4Q29udHJhY3QJAAIBAidrZWVwZXJFeENvbnRyYWN0IGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQULc3dvcEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQl3eEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQIhPQIJAMgBAQkA2QQBBQ5vcGVyYXRvclB1YktleQAgCQACAQIdb3BlcmF0b3JQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa01vbmV5Qm94BQxtb25leUJveEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa1NGRmFybWluZ0FkZHIFDXNmRmFybWluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa0xlbmRTZXJ2aWNlBQhsZW5kQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrUHJpY2VPcmFjbGUFD3ByaWNlT3JhY2xlQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQtrRXhDb250cmFjdAUQa2VlcGVyRXhDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rV3hTd2FwQ29udHJhY3QFDnd4U3dhcENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tTd29wSWQFC3N3b3BBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtXeElkBQl3eEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa09wZXJhdG9yQ2FsbFBLBQ5vcGVyYXRvclB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4xUEsFEmdyb3VwMUFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4yUEsFEmdyb3VwMUFkbWluMlB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4xUEsFEmdyb3VwMkFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4yUEsFEmdyb3VwMkFkbWluMlB1YktleQUDbmlsAWkBEGNyZWF0ZU5ld1JlcXVlc3QBBnBhcmFtcwkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpBAxuZXdSZXF1ZXN0SWQJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtSZXF1ZXN0SXRlcgAAAAEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQUMbmV3UmVxdWVzdElkBQprUmVxdWVzdElkBQZwYXJhbXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtSZXF1ZXN0SXRlcgUMbmV3UmVxdWVzdElkBQNuaWwFDG5ld1JlcXVlc3RJZAFpARFyZXBsZW5pc2hGcm9tTGFuZAEJcmVxdWVzdElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEDSR0MDU5ODYyNTk5ODEJAQxwYXJzZVJlcXVlc3QBBQlyZXF1ZXN0SWQEBHVzZXIIBQ0kdDA1OTg2MjU5OTgxAl8xBARwb29sCAUNJHQwNTk4NjI1OTk4MQJfMgQEcG10QQgFDSR0MDU5ODYyNTk5ODECXzMEA0FJZAgFDSR0MDU5ODYyNTk5ODECXzQEBHBtdEIIBQ0kdDA1OTg2MjU5OTgxAl81BANCSWQIBQ0kdDA1OTg2MjU5OTgxAl82BARiYWxBCAUNJHQwNTk4NjI1OTk4MQJfNwQEYmFsQggFDSR0MDU5ODYyNTk5ODECXzgEB3NoYXJlSWQIBQ0kdDA1OTg2MjU5OTgxAl85BAdid0Fzc2V0CAUNJHQwNTk4NjI1OTk4MQNfMTAECGJ3QW1vdW50CAUNJHQwNTk4NjI1OTk4MQNfMTEEDXN0YWtlVG9NYXJrZXQIBQ0kdDA1OTg2MjU5OTgxA18xMgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdid0Fzc2V0BgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGJ3QW1vdW50CQACAQINV3JvbmcgcGF5bWVudAQNJHQwNjAxNzE2MDI3MQMJAAACBQNBSWQFB2J3QXNzZXQJAJQKAgkAZAIFBHBtdEEFCGJ3QW1vdW50BQRwbXRCCQCUCgIFBHBtdEEJAGQCBQRwbXRCBQhid0Ftb3VudAQHcG10QWxsQQgFDSR0MDYwMTcxNjAyNzECXzEEB3BtdEFsbEIIBQ0kdDA2MDE3MTYwMjcxAl8yBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNjAzNTM2MDQ4MwkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQhMT0FOX0ZFRQUHcG10QWxsQQUDQUlkBQdwbXRBbGxCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFDXN0YWtlVG9NYXJrZXQECnVzZXJTdGFrZWQIBQ0kdDA2MDM1MzYwNDgzAl8xBAdheGx5RmVlCAUNJHQwNjAzNTM2MDQ4MwJfMgQGcG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgQNYm9ycm93RW50cmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAUIYndBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRJrVXNlckJvcnJvd0Fzc2V0SWQFB2J3QXNzZXQFA25pbAQHZW50cmllcwkBEHJlcGxlbmlzaEVudHJpZXMJBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQZwb3NOdW0FB3NoYXJlSWQFBXBUeXBlBgUNc3Rha2VUb01hcmtldAQNJHQwNjA4NTg2MDk3MwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDYwODU4NjA5NzMCXzEECHdBbW91bnRCCAUNJHQwNjA4NTg2MDk3MwJfMgkAlAoCCQDNCAIJAM4IAgkAzggCBQdlbnRyaWVzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAUNYm9ycm93RW50cmllcwkBC0RlbGV0ZUVudHJ5AQkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFCnVzZXJTdGFrZWQBaQEJbGlxdWlkYXRlAwR1c2VyBXBvc0lkD2xpcXVpZGF0ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpCQEMbGlxdWlkYXRlUG9zBAgFAWkGY2FsbGVyBQR1c2VyBQVwb3NJZAUPbGlxdWlkYXRlQW1vdW50AWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBQUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYCAAkAlAoCCQDNCAIIBQNyZXMCXzEJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwgFA3JlcwJfMgFpAQxjYXBpdGFsaXplRXgFBHBvb2wFcm91dGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDYyMzg5NjI0NTUJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwNjIzODk2MjQ1NQJfMQQDQklkCAUNJHQwNjIzODk2MjQ1NQJfMgQEYmFsQQgFDSR0MDYyMzg5NjI0NTUCXzMEBGJhbEIIBQ0kdDA2MjM4OTYyNDU1Al80BAdzaGFyZUlkCAUNJHQwNjIzODk2MjQ1NQJfNQQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQMaXNNYXJrZXRQb29sCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAUMa1Bvb2xQTUFya2V0BwQNJHQwNjI1ODQ2MzQxNQMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAAEDSR0MDYyNjQ2NjI3NDgJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQUGY2hhbmdlAwkAAAIFDSR0MDYyNjQ2NjI3NDgFDSR0MDYyNjQ2NjI3NDgEDGNsYWltZWRBc3NldAgFDSR0MDYyNjQ2NjI3NDgCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA2MjY0NjYyNzQ4Al8xBAVyQXJncwkAtQkCBQVyb3V0ZQICX18ED2V4Y2hhbmdlZEFtb3VudAMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAADCQAAAgkAkQMCBQVyQXJncwAAAhBkaXJlY3RTd29wZmlDUE1NCQEQZGlyZWN0U3dvcGZpQ1BNTQIFBXJBcmdzBQl0b2tlblRvSWQDCQAAAgkAkQMCBQVyQXJncwAAAg1yb3V0aW5nU3dvcGZpCQETZGlyZWN0Um91dGluZ1N3b3BmaQIFBXJBcmdzBQl0b2tlblRvSWQJAAIBAgtXcm9uZyByb3V0ZQAAAwkAAAIFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50BAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwFA25pbAQNJHQwNjMyNDU2MzM1NQkBCmNhcGl0YWxpemUJBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAtjYXBFbnRlcmlzZQgFDSR0MDYzMjQ1NjMzNTUCXzEEBnN0YWtlZAgFDSR0MDYzMjQ1NjMzNTUCXzIJAJQKAgkAzggCBQtjYXBFbnRlcmlzZQULY2hhbmdlRW50cnkFBnN0YWtlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQNuaWwAAAQLY2FwRW50ZXJpc2UIBQ0kdDA2MjU4NDYzNDE1Al8xBAZzdGFrZWQIBQ0kdDA2MjU4NDYzNDE1Al8yBA0kdDA2MzQxODYzNTM1AwUMaXNNYXJrZXRQb29sCQEWY2FwaXRhbGl6ZVB1enpsZU1hcmtldAMFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAAABBBtYXJrZXRDYXBFbnRlcmlzCAUNJHQwNjM0MTg2MzUzNQJfMQQMc3Rha2VkTWFya2V0CAUNJHQwNjM0MTg2MzUzNQJfMgkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgkAZAIFEHRvdGFsU2hhcmVBbW91bnQFBnN0YWtlZAUMc3Rha2VkTWFya2V0BQNuaWwFC2NhcEVudGVyaXNlBRBtYXJrZXRDYXBFbnRlcmlzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAUDbmlsAWkBDmNhcGl0YWxpemVOb0V4AwRwb29sBWNsYWltEWFtb3VudEZyb21CYWxhbmNlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDA2Mzk3MDY0MDM2CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDYzOTcwNjQwMzYCXzEEA0JJZAgFDSR0MDYzOTcwNjQwMzYCXzIEBGJhbEEIBQ0kdDA2Mzk3MDY0MDM2Al8zBARiYWxCCAUNJHQwNjM5NzA2NDAzNgJfNAQHc2hhcmVJZAgFDSR0MDYzOTcwNjQwMzYCXzUEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEDSR0MDY0MDg4NjQxODYJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQURYW1vdW50RnJvbUJhbGFuY2UAAAMJAAACBQ0kdDA2NDA4ODY0MTg2BQ0kdDA2NDA4ODY0MTg2BAxjbGFpbWVkQXNzZXQIBQ0kdDA2NDA4ODY0MTg2Al8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNjQwODg2NDE4NgJfMQQNJHQwNjQxODk2NDMzNQkBCmNhcGl0YWxpemUJBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAkAZAIFDWNsYWltZWRBbW91bnQFEWFtb3VudEZyb21CYWxhbmNlBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQLY2FwRW50ZXJpc2UIBQ0kdDA2NDE4OTY0MzM1Al8xBAZzdGFrZWQIBQ0kdDA2NDE4OTY0MzM1Al8yCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgUQdG90YWxTaGFyZUFtb3VudAUGc3Rha2VkBQNuaWwFC2NhcEVudGVyaXNlCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXROZXdQb29sCwR0eXBlCHBvb2xUeXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cKY2FuUE1hcmtldAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMDCQECIT0CBQR0eXBlBQdTRl9QT09MCQECIT0CBQR0eXBlBQdXWF9QT09MBwkAAgECCldyb25nIHR5cGUDAwkBAiE9AgUIcG9vbFR5cGUFBENQTU0JAQIhPQIFCHBvb2xUeXBlBQRGTEFUBwkAAgECD1dyb25nIHBvb2wgdHlwZQQNJHQwNjQ5NTg2NTA1MgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFCHBvb2xBZGRyBQR0eXBlBANhSWQIBQ0kdDA2NDk1ODY1MDUyAl8xBANiSWQIBQ0kdDA2NDk1ODY1MDUyAl8yBARhQmFsCAUNJHQwNjQ5NTg2NTA1MgJfMwQEYkJhbAgFDSR0MDY0OTU4NjUwNTICXzQEB3NoYXJlSWQIBQ0kdDA2NDk1ODY1MDUyAl81AwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrUG9vbEludGVyZXN0TG9hbgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVrUG9vbAUIcG9vbEFkZHIFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhwb29sQWRkcgUJa1Bvb2xUeXBlBQhwb29sVHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wFCHBvb2xBZGRyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ5rUG9vbENhbkJvcnJvdwUJY2FuQm9ycm93CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQxrUG9vbFBNQXJrZXQFCmNhblBNYXJrZXQFA25pbAFpAQ51cGRhdGVQb29sRmVlcwcIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQhwb29sQWRkcgkAAgEJAKwCAgIaQ2FuJ3QgZmluZCBwb29sIHdpdGggYWRkciAFCHBvb2xBZGRyAwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECE2RBcHAgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGBQNuaWwBaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQIVZEFwcCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwUDbmlsAWkBEGFjdGl2YXRlRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIdZEFwcCBhbHJlYWR5IGFjdGl2ZSBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwYFA25pbAFpARBzaHV0ZG93bkZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIfZEFwcCBhbHJlYWR5IHNodXRkb3duIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBwUDbmlsAWkBCmFjdGl2YXRlU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECFVNXT1BGSSBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93blNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECF1NXT1BGSSBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBCmFjdGl2YXRlV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECEVdYIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQITV1ggYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQxhY3RpdmF0ZVBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQITUG9vbCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYFA25pbAFpAQxzaHV0ZG93blBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhVQb29sIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUHBQNuaWwBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ5ncm91cDFBZG1pbjFQSwABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDmdyb3VwMUFkbWluMlBLAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUOZ3JvdXAxQWRtaW4zUEsAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIFE211bHRpU2lnbmVkQnlBZG1pbnOspKSZ", "height": 4040300, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HEGwPZPWqQBtMHJENPUpGnPnuTz9Ua9bMYUDWnN9sPbN Next: 79zvNnYB4kxRNQ3Jpk76NcnRYDKYBTVqv5rUJJBdsweD Diff:
OldNewDifferences
19061906 let balA = $t06397064036._3
19071907 let balB = $t06397064036._4
19081908 let shareId = $t06397064036._5
1909- let $t06403964137 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1910- if (($t06403964137 == $t06403964137))
1909+ let totalShareAmount = getPoolTotalShare(pool)
1910+ let $t06408864186 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1911+ if (($t06408864186 == $t06408864186))
19111912 then {
1912- let claimedAsset = $t06403964137._2
1913- let claimedAmount = $t06403964137._1
1914- capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance), AId, BId, balA, balB, shareId)
1913+ let claimedAsset = $t06408864186._2
1914+ let claimedAmount = $t06408864186._1
1915+ let $t06418964335 = capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance), AId, BId, balA, balB, shareId)
1916+ let capEnterise = $t06418964335._1
1917+ let staked = $t06418964335._2
1918+ (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
19151919 }
19161920 else throw("Strict value is not equal to itself.")
19171921 }))
19281932 else false)
19291933 then throw("Wrong pool type")
19301934 else {
1931- let $t06474464838 = getPoolData(Address(fromBase58String(poolAddr)), type)
1932- let aId = $t06474464838._1
1933- let bId = $t06474464838._2
1934- let aBal = $t06474464838._3
1935- let bBal = $t06474464838._4
1936- let shareId = $t06474464838._5
1935+ let $t06495865052 = getPoolData(Address(fromBase58String(poolAddr)), type)
1936+ let aId = $t06495865052._1
1937+ let bId = $t06495865052._2
1938+ let aBal = $t06495865052._3
1939+ let bBal = $t06495865052._4
1940+ let shareId = $t06495865052._5
19371941 if ((0 > inFeeNoLoan))
19381942 then throw("inFeeNoLoan must be greater than 0")
19391943 else if ((0 > inFeeLoan))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let CONF = addressFromStringValue(getStringValue(this, "config"))
55
66 let SF_POOL = "SF"
77
88 let WX_POOL = "WX"
99
1010 let CPMM = "cpmm"
1111
1212 let FLAT = "flat"
1313
1414 let CAP_FEE_NO_LOAN = "capNoLoan"
1515
1616 let CAP_FEE_LOAN = "capLoan"
1717
1818 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1919
2020 let STOPLOSS_LOAN = "stopLossLoan"
2121
2222 let LOAN_FEE = "loan"
2323
2424 let NO_LOAN_FEE = "noLoan"
2525
2626 let NO_FEE = "noFee"
2727
2828 let SCALE8 = 100000000
2929
3030 let SCALE10 = 10000000000
3131
3232 let SCALE16 = toBigInt(10000000000000000)
3333
3434 let FEE_SCALE6 = 1000000
3535
3636 let kSFPoolAAssetBalance = "A_asset_balance"
3737
3838 let kSFPoolBAssetBalance = "B_asset_balance"
3939
4040 let kSFPoolAAssetId = "A_asset_id"
4141
4242 let kSFPoolBAssetId = "B_asset_id"
4343
4444 let kSFPoolShareId = "share_asset_id"
4545
4646 let kSFPoolShareSupply = "share_asset_supply"
4747
4848 let kSFPoolFee = "commission"
4949
5050 let kUserPosition = "_userPosition"
5151
5252 let kUserPositionPool = "_userPositionPool"
5353
5454 let kUserBorrowAmount = "_userPositionBorrowAmount"
5555
5656 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5757
5858 let kUserPositionNum = "_userPositionNumber"
5959
6060 let kUserPositionInterest = "_userPositionInterest"
6161
6262 let kUserPositionInPMarket = "_userPositionPMarket"
6363
6464 let kPoolTotal = "_poolTotal"
6565
6666 let kPoolTotalLoan = "_poolTotalLoan"
6767
6868 let kPoolTotalMarket = "_poolTotalMarket"
6969
7070 let kPoolTotalMarketLoan = "_poolTotalMarketLoan"
7171
7272 let kPoolInterestLoan = "_poolInterestLoan"
7373
7474 let kPoolInterestNoLoan = "_poolInterestNoLoan"
7575
7676 let kPoolInterestMarketLoan = "_poolInterestMarketLoan"
7777
7878 let kPoolInterestMarketNoLoan = "_poolInterestMarketNoLoan"
7979
8080 let kPoolCanBorrow = "_poolCanBorrow"
8181
8282 let kPoolPMArket = "_poolPuzzleMarket"
8383
8484 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
8585
8686 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
8787
8888 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
8989
9090 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
9191
9292 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
9393
9494 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
9595
9696 let kRequestId = "_request_id"
9797
9898 let kRequestIter = "requests_iter"
9999
100100 let kPool = "pool_"
101101
102102 let kPoolType = "_poolType"
103103
104104 let kSharePool = "_poolShareId"
105105
106106 let kPoolCapChange = "_poolCapChange"
107107
108108 let kTokenLastPrice = "last_price"
109109
110110 let kPriceInOracle = "_twap5B"
111111
112112 let kActive = "active"
113113
114114 let kActiveUsers = "activeUsers"
115115
116116 let kActiveSFWX = "_active"
117117
118118 let kPoolActive = "_activePool"
119119
120120 let kUserStopLoss = "_stopLoss"
121121
122122 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
123123
124124 let kPoolProxyAddr = "_poolProxyAddress"
125125
126126 let kMoneyBox = "axly_money_box"
127127
128128 let kSFFarmingAddr = "swopfi_farming_addr"
129129
130130 let kLendService = "lend_service_addr"
131131
132132 let kOperatorCallPK = "admin_call_pub_key"
133133
134134 let kPriceOracle = "price_oracle"
135135
136136 let kExContract = "exchange_contract"
137137
138138 let kWxSwapContract = "wx_swap_contract"
139139
140140 let kWxRest = "wx_rest_addr"
141141
142142 let kSwopId = "swop_id"
143143
144144 let kWxId = "wx_id"
145145
146146 let kPMarketAddr = "puzzle_market_address"
147147
148148 let kPMarketRestAddr = "puzzle_market_rest_address"
149149
150150 let kGroup1Admin1PK = "group1_admin1_pub_key"
151151
152152 let kGroup1Admin2PK = "group1_admin2_pub_key"
153153
154154 let kGroup1Admin3PK = "group1_admin3_pub_key"
155155
156156 let kGroup2Admin1PK = "group2_admin1_pub_key"
157157
158158 let kGroup2Admin2PK = "group2_admin2_pub_key"
159159
160160 let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
161161
162162 let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
163163
164164 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
165165
166166 let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
167167
168168 let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
169169
170170 let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
171171
172172 let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
173173
174174 let pMarketAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketAddr), "No puzzle market address"))
175175
176176 let pMarketRestAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketRestAddr), "No puzzle market rest address"))
177177
178178 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
179179
180180 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
181181
182182 let group1Admin3PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin3PK), "Can't get kGroup1Admin3PK"))
183183
184184 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
185185
186186 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
187187
188188 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
189189
190190 func unknownPoolType () = throw("Wrong pool type")
191191
192192
193193 func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
194194
195195
196196 func isOperatorCall (i) = if (if ((i.callerPublicKey == operatorPK))
197197 then true
198198 else (i.caller == moneyBox))
199199 then unit
200200 else throw("Only operator can call this function")
201201
202202
203203 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
204204 then true
205205 else (i.callerPublicKey == group1Admin2PK))
206206 then unit
207207 else throw("Only admin group1 can call this function")
208208
209209
210210 func isSelfCall (i) = if ((i.caller == this))
211211 then unit
212212 else throw("Only contract itself can call this function")
213213
214214
215215 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
216216 then unit
217217 else throw("Only land contract can call this function")
218218
219219
220220 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
221221 then unit
222222 else throw("DApp is inactive at this moment")
223223
224224
225225 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
226226 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
227227 else false)
228228 then unit
229229 else throw("DApp is inactive for users at this moment")
230230
231231
232232 func isPoolActive (pool,type) = {
233233 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
234234 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
235235 if (if (WXSFActive)
236236 then poolActive
237237 else false)
238238 then true
239239 else false
240240 }
241241
242242
243243 func accountBalance (assetId) = match assetId {
244244 case id: ByteVector =>
245245 assetBalance(this, id)
246246 case waves: Unit =>
247247 wavesBalance(this).available
248248 case _ =>
249249 throw("Match error")
250250 }
251251
252252
253253 func getSFPoolBalances (poolAddr) = $Tuple2(valueOrErrorMessage(getInteger(poolAddr, kSFPoolAAssetBalance), "Can't get pool A asset balance"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolBAssetBalance), "Can't get pool B asset balance"))
254254
255255
256256 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
257257 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
258258 if ($isInstanceOf(@, "Int"))
259259 then @
260260 else throw(($getType(@) + " couldn't be cast to Int"))
261261 }, {
262262 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
263263 if ($isInstanceOf(@, "Int"))
264264 then @
265265 else throw(($getType(@) + " couldn't be cast to Int"))
266266 })
267267
268268
269269 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
270270 then getSFPoolBalances(poolAddr)
271271 else if ((type == WX_POOL))
272272 then getWXPoolBalances(poolAddr, aId, bId)
273273 else unknownPoolType()
274274
275275
276276 func getSFPoolData (poolAddr) = {
277277 let $t096559704 = getSFPoolBalances(poolAddr)
278278 if (($t096559704 == $t096559704))
279279 then {
280280 let balB = $t096559704._2
281281 let balA = $t096559704._1
282282 $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), balA, balB, valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
283283 }
284284 else throw("Strict value is not equal to itself.")
285285 }
286286
287287
288288 func getWXPoolData (poolAddr) = {
289289 let cfg = {
290290 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
291291 if ($isInstanceOf(@, "List[Any]"))
292292 then @
293293 else throw(($getType(@) + " couldn't be cast to List[Any]"))
294294 }
295295 if ((cfg == cfg))
296296 then {
297297 let aId = valueOrErrorMessage({
298298 let @ = cfg[4]
299299 if ($isInstanceOf(@, "String"))
300300 then @
301301 else unit
302302 }, "Can't get pool A asset id")
303303 let bId = valueOrErrorMessage({
304304 let @ = cfg[5]
305305 if ($isInstanceOf(@, "String"))
306306 then @
307307 else unit
308308 }, "Can't get pool B asset id")
309309 let shareId = valueOrErrorMessage({
310310 let @ = cfg[3]
311311 if ($isInstanceOf(@, "String"))
312312 then @
313313 else unit
314314 }, "Can't get pool LP asset id")
315315 let $t01040110460 = getWXPoolBalances(poolAddr, aId, bId)
316316 if (($t01040110460 == $t01040110460))
317317 then {
318318 let balB = $t01040110460._2
319319 let balA = $t01040110460._1
320320 $Tuple5(aId, bId, balA, balB, shareId)
321321 }
322322 else throw("Strict value is not equal to itself.")
323323 }
324324 else throw("Strict value is not equal to itself.")
325325 }
326326
327327
328328 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
329329 then getSFPoolData(poolAddr)
330330 else if ((type == WX_POOL))
331331 then getWXPoolData(poolAddr)
332332 else unknownPoolType()
333333
334334
335335 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
336336 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
337337 else if ((type == WX_POOL))
338338 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
339339 else unknownPoolType()
340340
341341
342342 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
343343
344344
345345 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
346346
347347
348348 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
349349
350350
351351 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
352352 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
353353 else if ((feeType == CAP_FEE_NO_LOAN))
354354 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
355355 else if ((feeType == LOAN_FEE))
356356 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
357357 else if ((feeType == NO_LOAN_FEE))
358358 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
359359 else if ((feeType == NO_FEE))
360360 then 0
361361 else throw("Wrong fee type")
362362
363363
364364 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(CONF, kSFFarmingAddr), "Can't get swopfi farming addr")))
365365
366366
367367 func getWXFarmingAddr (poolAddr) = {
368368 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
369369 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
370370 Address(fromBase58String(factroyCfg[1]))
371371 }
372372
373373
374374 func assetIdToStr (assetId) = match assetId {
375375 case id: ByteVector =>
376376 toBase58String(id)
377377 case waves: Unit =>
378378 "WAVES"
379379 case _ =>
380380 throw("Not Asset id")
381381 }
382382
383383
384384 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
385385 then unit
386386 else fromBase58String(assetId)
387387
388388
389389 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
390390 then 8
391391 else match assetInfo(fromBase58String(assetId)) {
392392 case asset: Asset =>
393393 asset.decimals
394394 case _ =>
395395 throw("Can't find asset")
396396 }
397397
398398
399399 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
400400
401401
402402 func getAssetsPrice (assetIds) = {
403403 func getPrices (a,assetId) = {
404404 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
405405 (a :+ assetPrice)
406406 }
407407
408408 let $l = assetIds
409409 let $s = size($l)
410410 let $acc0 = nil
411411 func $f0_1 ($a,$i) = if (($i >= $s))
412412 then $a
413413 else getPrices($a, $l[$i])
414414
415415 func $f0_2 ($a,$i) = if (($i >= $s))
416416 then $a
417417 else throw("List size exceeds 50")
418418
419419 $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)
420420 }
421421
422422
423423 func getSharePrice (shareId) = {
424424 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
425425 let poolAddr = Address(fromBase58String(pool))
426426 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
427427 let $t01344913514 = getPoolData(poolAddr, pType)
428428 let aId = $t01344913514._1
429429 let bId = $t01344913514._2
430430 let aBalance = $t01344913514._3
431431 let bBalance = $t01344913514._4
432432 let prices = getAssetsPrice([aId, bId])
433433 let dPriceA = prices[0]
434434 let dPriceB = prices[1]
435435 if (if ((0 > dPriceA))
436436 then true
437437 else (0 > dPriceB))
438438 then -1
439439 else {
440440 let shareSupply = getShareSupply(poolAddr, pType, shareId)
441441 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
442442 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
443443 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
444444 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
445445 fraction(sum, sharePrecision, shareSupply)
446446 }
447447 }
448448
449449
450450 func getSharePrices (shareIds) = {
451451 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
452452
453453 let $l = shareIds
454454 let $s = size($l)
455455 let $acc0 = nil
456456 func $f0_1 ($a,$i) = if (($i >= $s))
457457 then $a
458458 else getPrices($a, $l[$i])
459459
460460 func $f0_2 ($a,$i) = if (($i >= $s))
461461 then $a
462462 else throw("List size exceeds 20")
463463
464464 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
465465 }
466466
467467
468468 func getCursEntries (aId,bId,shareId,wAmounts) = {
469469 let assetsPrices = getAssetsPrice([aId, bId])
470470 let sharePrice = getSharePrice(shareId)
471471 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
472472 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
473473 }
474474
475475
476476 func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
477477 then {
478478 let repl = {
479479 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
480480 if ($isInstanceOf(@, "List[Any]"))
481481 then @
482482 else throw(($getType(@) + " couldn't be cast to List[Any]"))
483483 }
484484 if ((repl == repl))
485485 then $Tuple5({
486486 let @ = repl[3]
487487 if ($isInstanceOf(@, "Int"))
488488 then @
489489 else throw(($getType(@) + " couldn't be cast to Int"))
490490 }, {
491491 let @ = repl[4]
492492 if ($isInstanceOf(@, "Int"))
493493 then @
494494 else throw(($getType(@) + " couldn't be cast to Int"))
495495 }, {
496496 let @ = repl[1]
497497 if ($isInstanceOf(@, "Int"))
498498 then @
499499 else throw(($getType(@) + " couldn't be cast to Int"))
500500 }, assetIdToStr(repl[2]), {
501501 let @ = repl[0]
502502 if ($isInstanceOf(@, "Int"))
503503 then @
504504 else throw(($getType(@) + " couldn't be cast to Int"))
505505 })
506506 else throw("Strict value is not equal to itself.")
507507 }
508508 else if ((pType == WX_POOL))
509509 then {
510510 let $t01507215338 = $Tuple2(split({
511511 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
512512 if ($isInstanceOf(@, "String"))
513513 then @
514514 else throw(($getType(@) + " couldn't be cast to String"))
515515 }, "__"), split({
516516 let @ = invoke(wxRest, "poolEvaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
517517 if ($isInstanceOf(@, "String"))
518518 then @
519519 else throw(($getType(@) + " couldn't be cast to String"))
520520 }, "__"))
521521 if (($t01507215338 == $t01507215338))
522522 then {
523523 let evalPutInB = $t01507215338._2
524524 let evalPutInA = $t01507215338._1
525525 let lpInA = parseIntValue(evalPutInA[1])
526526 let lpInB = parseIntValue(evalPutInB[1])
527527 if ((lpInB > lpInA))
528528 then {
529529 let pmt = parseIntValue(evalPutInA[8])
530530 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
531531 }
532532 else {
533533 let pmt = parseIntValue(evalPutInB[7])
534534 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
535535 }
536536 }
537537 else throw("Strict value is not equal to itself.")
538538 }
539539 else unknownPoolType()
540540
541541
542542 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId,lpId) = {
543543 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
544544 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
545545 if ((pType == SF_POOL))
546546 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
547547 else if ((pType == WX_POOL))
548548 then if ((proxyAddr == ""))
549549 then invoke(poolAddr, "put", [1000000, false], payments)
550550 else invoke(addressFromStringValue(proxyAddr), "wxReplenishTwoTokens", [toString(poolAddr), lpId, 1000000, false], payments)
551551 else unknownPoolType()
552552 }
553553
554554
555555 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId,lpId) = {
556556 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
557557 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
558558 if ((pType == SF_POOL))
559559 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
560560 else if ((pType == WX_POOL))
561561 then {
562562 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
563563 then "putOneTknV2"
564564 else "putOneTkn"
565565 if ((proxyAddr == ""))
566566 then invoke(poolAddr, fc, [0, false], payments)
567567 else invoke(addressFromStringValue(proxyAddr), "wxReplenishOneToken", [toString(poolAddr), lpId, fc, 0, false], payments)
568568 }
569569 else unknownPoolType()
570570 }
571571
572572
573573 func stakeLP (pool,pType,shareId,amount,stakeToMarket) = {
574574 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
575575 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
576576 if (stakeToMarket)
577577 then invoke(pMarketAddr, "supply", nil, payments)
578578 else if ((pType == SF_POOL))
579579 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
580580 else if ((pType == WX_POOL))
581581 then {
582582 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
583583 if ((proxyAddr == ""))
584584 then invoke(farmAddr, "stake", nil, payments)
585585 else invoke(addressFromStringValue(proxyAddr), "wxStakeLp", [toString(farmAddr)], payments)
586586 }
587587 else unknownPoolType()
588588 }
589589
590590
591591 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
592592 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
593593 let $t01807518757 = if (fromMarket)
594594 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
595595 else if ((pType == SF_POOL))
596596 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
597597 else if ((pType == WX_POOL))
598598 then {
599599 let farmAddr = getWXFarmingAddr(Address(fromBase58String(pool)))
600600 if ((proxyAddr == ""))
601601 then $Tuple3(farmAddr, "unstake", [shareId, amount])
602602 else $Tuple3(addressFromStringValue(proxyAddr), "wxUnstakeLp", [toString(farmAddr), shareId, amount])
603603 }
604604 else unknownPoolType()
605605 let farmAddr = $t01807518757._1
606606 let fName = $t01807518757._2
607607 let params = $t01807518757._3
608608 let inv = invoke(farmAddr, fName, params, nil)
609609 if ((inv == inv))
610610 then amount
611611 else throw("Strict value is not equal to itself.")
612612 }
613613
614614
615615 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
616616 let poolAddr = Address(fromBase58String(pool))
617617 let feeScale6 = 1000000
618618 let fee = getIntegerValue(poolAddr, kSFPoolFee)
619619 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
620620 let $t01917919485 = if ((assetTokenToGet == assetIdA))
621621 then {
622622 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
623623 $Tuple2(amountToPay, assetIdB)
624624 }
625625 else {
626626 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
627627 $Tuple2(amountToPay, assetIdA)
628628 }
629629 let amountToPay = $t01917919485._1
630630 let assetToPay = $t01917919485._2
631631 $Tuple2(assetToPay, amountToPay)
632632 }
633633
634634
635635 func getWXSwapFees (pool) = {
636636 let poolAddr = addressFromStringValue(pool)
637637 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
638638 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
639639 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
640640 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
641641 case fees: (Int, Int) =>
642642 $Tuple2(fees._1, fees._2)
643643 case _ =>
644644 $Tuple2(poolFeeDefault, protocolFeeDefault)
645645 }
646646 }
647647
648648
649649 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
650650 let $t02022520264 = getWXSwapFees(pool)
651651 let pFee = $t02022520264._1
652652 let prFee = $t02022520264._2
653653 let feeScale = toBigInt(100000000)
654654 let $t02030420612 = if ((assetTokenToGet == assetIdA))
655655 then {
656656 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
657657 $Tuple2(amountToPay, assetIdB)
658658 }
659659 else {
660660 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
661661 $Tuple2(amountToPay, assetIdA)
662662 }
663663 let amountToPay = $t02030420612._1
664664 let assetToPay = $t02030420612._2
665665 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
666666 $Tuple2(assetToPay, amountToPayWithFee)
667667 }
668668
669669
670670 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
671671 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
672672 if (if ((pType == SF_POOL))
673673 then true
674674 else (poolFB != ""))
675675 then {
676676 let $t02105321265 = if ((poolFB == ""))
677677 then $Tuple3(balA, balB, pool)
678678 else {
679679 let $t02115921232 = getSFPoolBalances(addressFromStringValue(poolFB))
680680 let sfBalA = $t02115921232._1
681681 let sfBalB = $t02115921232._2
682682 $Tuple3(sfBalA, sfBalB, poolFB)
683683 }
684684 let pBalA = $t02105321265._1
685685 let pBalB = $t02105321265._2
686686 let exPool = $t02105321265._3
687687 let $t02127021396 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
688688 let assetToPay = $t02127021396._1
689689 let amountToPay = $t02127021396._2
690690 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
691691 }
692692 else if ((pType == WX_POOL))
693693 then {
694694 let $t02159821720 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
695695 let assetToPay = $t02159821720._1
696696 let amountToPay = $t02159821720._2
697697 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
698698 }
699699 else unknownPoolType()
700700 }
701701
702702
703703 func exchangeDirectlyNoLim (pType,pool,amountTokenEx,assetTokenToEx,assetTokenToGet) = {
704704 let balBefore = accountBalance(assetIdFromStr(assetTokenToGet))
705705 if ((balBefore == balBefore))
706706 then {
707707 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
708708 let inv = if (if ((pType == SF_POOL))
709709 then true
710710 else (poolFB != ""))
711711 then {
712712 let exPool = if ((poolFB == ""))
713713 then pool
714714 else poolFB
715715 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
716716 }
717717 else if ((pType == WX_POOL))
718718 then invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
719719 else unknownPoolType()
720720 if ((inv == inv))
721721 then {
722722 let balAfter = accountBalance(assetIdFromStr(assetTokenToGet))
723723 if ((balAfter == balAfter))
724724 then (balAfter - balBefore)
725725 else throw("Strict value is not equal to itself.")
726726 }
727727 else throw("Strict value is not equal to itself.")
728728 }
729729 else throw("Strict value is not equal to itself.")
730730 }
731731
732732
733733 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
734734 let $t02284923320 = if ((pType == SF_POOL))
735735 then {
736736 let inv = {
737737 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
738738 if ($isInstanceOf(@, "List[Any]"))
739739 then @
740740 else throw(($getType(@) + " couldn't be cast to List[Any]"))
741741 }
742742 if ((inv == inv))
743743 then $Tuple2({
744744 let @ = inv[0]
745745 if ($isInstanceOf(@, "Int"))
746746 then @
747747 else throw(($getType(@) + " couldn't be cast to Int"))
748748 }, {
749749 let @ = inv[1]
750750 if ($isInstanceOf(@, "Int"))
751751 then @
752752 else throw(($getType(@) + " couldn't be cast to Int"))
753753 })
754754 else throw("Strict value is not equal to itself.")
755755 }
756756 else if ((pType == WX_POOL))
757757 then {
758758 let inv = split({
759759 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
760760 if ($isInstanceOf(@, "String"))
761761 then @
762762 else throw(($getType(@) + " couldn't be cast to String"))
763763 }, "__")
764764 if ((inv == inv))
765765 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
766766 else throw("Strict value is not equal to itself.")
767767 }
768768 else unknownPoolType()
769769 let amountA = $t02284923320._1
770770 let amountB = $t02284923320._2
771771 $Tuple2(amountA, amountB)
772772 }
773773
774774
775775 func claimFarmed (pType,pool) = {
776776 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
777777 if ((pType == SF_POOL))
778778 then {
779779 let balBefore = accountBalance(SWOPID)
780780 if ((balBefore == balBefore))
781781 then {
782782 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
783783 if ((inv == inv))
784784 then {
785785 let balAfter = accountBalance(SWOPID)
786786 $Tuple2((balAfter - balBefore), SWOPID)
787787 }
788788 else throw("Strict value is not equal to itself.")
789789 }
790790 else throw("Strict value is not equal to itself.")
791791 }
792792 else if ((pType == WX_POOL))
793793 then {
794794 let $t02376023839 = getWXPoolData(addressFromStringValue(pool))
795795 let aId = $t02376023839._1
796796 let bId = $t02376023839._2
797797 let aBal = $t02376023839._3
798798 let bBal = $t02376023839._4
799799 let lpId = $t02376023839._5
800800 let balBefore = accountBalance(WXID)
801801 if ((balBefore == balBefore))
802802 then {
803803 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
804804 let inv = if ((proxyAddr == ""))
805805 then invoke(farmAddr, "claimWx", [lpId], nil)
806806 else invoke(addressFromStringValue(proxyAddr), "wxClaimFarmed", [toString(farmAddr), lpId], nil)
807807 if ((inv == inv))
808808 then {
809809 let balAfter = accountBalance(WXID)
810810 $Tuple2((balAfter - balBefore), WXID)
811811 }
812812 else throw("Strict value is not equal to itself.")
813813 }
814814 else throw("Strict value is not equal to itself.")
815815 }
816816 else unknownPoolType()
817817 }
818818
819819
820820 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId,stakeMarket) = {
821821 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
822822 if ((lpBalanceBefore == lpBalanceBefore))
823823 then {
824824 let poolAddr = addressFromStringValue(pool)
825825 let $t02464425072 = if (if ((pmtA > 0))
826826 then (pmtB > 0)
827827 else false)
828828 then {
829829 let $t02471024832 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
830830 let pmtInA = $t02471024832._1
831831 let pmtInB = $t02471024832._2
832832 let change = $t02471024832._3
833833 let changeId = $t02471024832._4
834834 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
835835 if ((inv == inv))
836836 then $Tuple2(change, changeId)
837837 else throw("Strict value is not equal to itself.")
838838 }
839839 else if ((pmtA > 0))
840840 then $Tuple2(pmtA, aId)
841841 else if ((pmtB > 0))
842842 then $Tuple2(pmtB, bId)
843843 else throw("pmts must be > 0")
844844 let change = $t02464425072._1
845845 let changeId = $t02464425072._2
846846 let inv = if ((change > 0))
847847 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
848848 else nil
849849 if ((inv == inv))
850850 then {
851851 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
852852 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
853853 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
854854 let userShareForStake = (totalStaked - axlyFeeAmount)
855855 if ((0 >= userShareForStake))
856856 then throw("amount of staked sharetokens must be > 0")
857857 else {
858858 let invLP = stakeLP(pool, pType, LPId, userShareForStake, stakeMarket)
859859 if ((invLP == invLP))
860860 then $Tuple2(userShareForStake, axlyFeeAmount)
861861 else throw("Strict value is not equal to itself.")
862862 }
863863 }
864864 else throw("Strict value is not equal to itself.")
865865 }
866866 else throw("Strict value is not equal to itself.")
867867 }
868868
869869
870870 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan,stakeToMarket) = {
871871 let totalAmount = getPoolTotalShare(pool)
872872 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
873873 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
874874 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
875875 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
876876 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
877877 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
878878 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
879879 let $t02653327358 = if (withLoan)
880880 then if (stakeToMarket)
881881 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
882882 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
883883 else if (stakeToMarket)
884884 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
885885 else $Tuple2(poolInterestNoLoan, nil)
886886 let curPoolInterest = $t02653327358._1
887887 let adEntry = $t02653327358._2
888888 ([IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), StringEntry((((user + "_") + toString(posNum)) + kUserPositionPool), pool), IntegerEntry((user + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))] ++ adEntry)
889889 }
890890
891891
892892 func listToInt (a,item) = (a :+ parseIntValue(item))
893893
894894
895895 func directSwopfiCPMM (rArgs,tokenTo) = {
896896 let dApp = addressFromStringValue(rArgs[1])
897897 let pmtP = split(rArgs[2], "|")
898898 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
899899 if ((tokenBalanceBefore == tokenBalanceBefore))
900900 then {
901901 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
902902 let minToRecive = rArgs[3]
903903 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
904904 if ((inv == inv))
905905 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
906906 else throw("Strict value is not equal to itself.")
907907 }
908908 else throw("Strict value is not equal to itself.")
909909 }
910910
911911
912912 func directRoutingSwopfi (rArgs,tokenTo) = {
913913 let dApp = addressFromStringValue(rArgs[1])
914914 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
915915 if ((tokenBalanceBefore == tokenBalanceBefore))
916916 then {
917917 let pmt = {
918918 let pmtP = split(rArgs[2], "|")
919919 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
920920 }
921921 let args = {
922922 let eArgs = split(rArgs[3], "|")
923923 let exchangers = split(eArgs[0], ",")
924924 let exchangersType = split(eArgs[1], ",")
925925 let args1 = {
926926 let $l = split(eArgs[2], ",")
927927 let $s = size($l)
928928 let $acc0 = nil
929929 func $f0_1 ($a,$i) = if (($i >= $s))
930930 then $a
931931 else listToInt($a, $l[$i])
932932
933933 func $f0_2 ($a,$i) = if (($i >= $s))
934934 then $a
935935 else throw("List size exceeds 3")
936936
937937 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
938938 }
939939 let args2 = {
940940 let $l = split(eArgs[3], ",")
941941 let $s = size($l)
942942 let $acc0 = nil
943943 func $f1_1 ($a,$i) = if (($i >= $s))
944944 then $a
945945 else listToInt($a, $l[$i])
946946
947947 func $f1_2 ($a,$i) = if (($i >= $s))
948948 then $a
949949 else throw("List size exceeds 3")
950950
951951 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
952952 }
953953 let routingAssetsKeys = split(eArgs[4], ",")
954954 let minToRecive = parseIntValue(eArgs[5])
955955 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
956956 }
957957 let inv = invoke(dApp, "routingTrade", args, pmt)
958958 if ((inv == inv))
959959 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
960960 else throw("Strict value is not equal to itself.")
961961 }
962962 else throw("Strict value is not equal to itself.")
963963 }
964964
965965
966966 func capitalize (pool,pType,tokenId,tokenAmount,AId,BId,balA,balB,shareId) = if (if ((tokenId != AId))
967967 then (tokenId != BId)
968968 else false)
969969 then throw("Wrong asset")
970970 else {
971971 let totalShareAmount = getPoolTotalShare(pool)
972972 if ((totalShareAmount == 0))
973973 then $Tuple2([ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))], 0)
974974 else {
975975 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
976976 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
977977 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, (totalShareAmount - totalMarketAmount))
978978 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
979979 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
980980 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
981981 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
982982 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
983983 let $t03027530375 = if ((tokenId == AId))
984984 then $Tuple2((tokenAmount - axlyFee), 0)
985985 else $Tuple2(0, (tokenAmount - axlyFee))
986986 let pmtA = $t03027530375._1
987987 let pmtB = $t03027530375._2
988988 let $t03037830489 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
989989 let stakedAmount = $t03037830489._1
990990 let nf = $t03037830489._2
991991 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
992992 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
993993 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
994994 let stakedNoLoan = (stakedAmount - stakedLoan)
995995 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
996996 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
997997 else 0
998998 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
999999 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
10001000 else 0
10011001 $Tuple2([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))], stakedAmount)
10021002 }
10031003 }
10041004
10051005
10061006 func capitalizePuzzleMarket (pool,pType,shareId) = {
10071007 let totalShareAmount = getPoolTotalShare(pool)
10081008 let marketBalance = assetBalance(pMarketAddr, fromBase58String(shareId))
10091009 if ((marketBalance == marketBalance))
10101010 then {
10111011 let marketAvailable = {
10121012 let @ = invoke(pMarketRestAddr, "assetSupplyByAddressREADONLY", [toString(pMarketAddr), shareId, toString(this)], nil)
10131013 if ($isInstanceOf(@, "Int"))
10141014 then @
10151015 else throw(($getType(@) + " couldn't be cast to Int"))
10161016 }
10171017 if ((marketAvailable == marketAvailable))
10181018 then {
10191019 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
10201020 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
10211021 if (if ((totalMarketAmount == 0))
10221022 then (marketAvailable > 0)
10231023 else false)
10241024 then {
10251025 let unstakedAmount = unstakeLP(pool, pType, shareId, marketAvailable, true)
10261026 if ((unstakedAmount == unstakedAmount))
10271027 then if ((marketBalance > unstakedAmount))
10281028 then $Tuple2([ScriptTransfer(moneyBox, unstakedAmount, fromBase58String(shareId))], 0)
10291029 else $Tuple2(nil, 0)
10301030 else throw("Strict value is not equal to itself.")
10311031 }
10321032 else {
10331033 let capAmount = (marketAvailable - totalMarketAmount)
10341034 if ((0 >= capAmount))
10351035 then $Tuple2(nil, 0)
10361036 else {
10371037 let marketLoanPercent = fraction(totalMarketAmountWithLoan, SCALE8, totalMarketAmount)
10381038 let tokensMarketForFeeLoan = fraction(capAmount, marketLoanPercent, SCALE8)
10391039 let tokensMarketForForFeeNoLoan = (capAmount - tokensMarketForFeeLoan)
10401040 let axlyMarketFeeLoan = fraction(tokensMarketForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10411041 let axlyMarketFeeNoLoan = fraction(tokensMarketForForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10421042 let axlyMarketFee = (axlyMarketFeeLoan + axlyMarketFeeNoLoan)
10431043 if ((axlyMarketFee > marketBalance))
10441044 then $Tuple2(nil, 0)
10451045 else {
10461046 let stakedMarketAmount = (capAmount - axlyMarketFee)
10471047 let stakedMarketLoan = fraction(stakedMarketAmount, marketLoanPercent, SCALE8)
10481048 let stakedMarketNoLoan = (stakedMarketAmount - stakedMarketLoan)
10491049 let curPoolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
10501050 let curPoolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
10511051 let newInterestMarketLoan = if ((totalMarketAmountWithLoan > 0))
10521052 then (curPoolInterestMarketLoan + fraction(stakedMarketLoan, SCALE10, totalMarketAmountWithLoan))
10531053 else 0
10541054 let newInterestMarketNoLoan = if (((totalMarketAmount - totalMarketAmountWithLoan) > 0))
10551055 then (curPoolInterestMarketNoLoan + fraction(stakedMarketNoLoan, SCALE10, (totalMarketAmount - totalMarketAmountWithLoan)))
10561056 else 0
10571057 let unstakedAmount = unstakeLP(pool, pType, shareId, axlyMarketFee, true)
10581058 if ((unstakedAmount == unstakedAmount))
10591059 then $Tuple2([IntegerEntry((pool + kPoolInterestMarketLoan), newInterestMarketLoan), IntegerEntry((pool + kPoolInterestMarketNoLoan), newInterestMarketNoLoan), IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount + stakedMarketAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan + stakedMarketLoan)), ScriptTransfer(moneyBox, axlyMarketFee, assetIdFromStr(shareId))], stakedMarketAmount)
10601060 else throw("Strict value is not equal to itself.")
10611061 }
10621062 }
10631063 }
10641064 }
10651065 else throw("Strict value is not equal to itself.")
10661066 }
10671067 else throw("Strict value is not equal to itself.")
10681068 }
10691069
10701070
10711071 func userCanWithdrawShareCalc (user,pool,posId,borrowed,isMarketPos) = {
10721072 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
10731073 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
10741074 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
10751075 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10761076 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
10771077 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
10781078 let poolInterest = if (borrowed)
10791079 then if (isMarketPos)
10801080 then poolInterestMarketLoan
10811081 else poolInterestLoan
10821082 else if (isMarketPos)
10831083 then poolInterestMarketNoLoan
10841084 else poolInterestNoLoan
10851085 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
10861086 }
10871087
10881088
10891089 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
10901090 let feeType = if (isBorrowed)
10911091 then STOPLOSS_LOAN
10921092 else STOPLOSS_FEE_NO_LOAN
10931093 if (stopLoss)
10941094 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
10951095 else 0
10961096 }
10971097
10981098
10991099 func withdrawToUser (user,pool,posId,stopLoss,withdrawToken) = {
11001100 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
11011101 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
11021102 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
11031103 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed, fromMarket)
11041104 let poolTotalShare = getPoolTotalShare(pool)
11051105 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
11061106 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
11071107 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
11081108 let userAddr = Address(fromBase58String(user))
11091109 let poolAddr = Address(fromBase58String(pool))
11101110 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
11111111 let $t03654036612 = getPoolData(poolAddr, pType)
11121112 let idAStr = $t03654036612._1
11131113 let idBStr = $t03654036612._2
11141114 let balA = $t03654036612._3
11151115 let balB = $t03654036612._4
11161116 let shareId = $t03654036612._5
11171117 let $t03661536682 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
11181118 let idA = $t03661536682._1
11191119 let idB = $t03661536682._2
11201120 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
11211121 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
11221122 let cBalABefore = accountBalance(idA)
11231123 if ((cBalABefore == cBalABefore))
11241124 then {
11251125 let cBalBBefore = accountBalance(idB)
11261126 if ((cBalBBefore == cBalBBefore))
11271127 then {
11281128 let inv = if ((pType == SF_POOL))
11291129 then {
11301130 let inv = unstakeLP(pool, pType, shareId, stopLossFee, fromMarket)
11311131 if ((inv == inv))
11321132 then invoke(poolAddr, "callFunction", ["withdraw", [toString((userCanWithdraw - stopLossFee))]], nil)
11331133 else throw("Strict value is not equal to itself.")
11341134 }
11351135 else if ((pType == WX_POOL))
11361136 then {
11371137 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee), fromMarket)
11381138 if ((inv == inv))
11391139 then if ((proxyAddr == ""))
11401140 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
11411141 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
11421142 else throw("Strict value is not equal to itself.")
11431143 }
11441144 else unknownPoolType()
11451145 if ((inv == inv))
11461146 then {
11471147 let cBalAAfter = accountBalance(idA)
11481148 if ((cBalAAfter == cBalAAfter))
11491149 then {
11501150 let cBalBAfter = accountBalance(idB)
11511151 if ((cBalBAfter == cBalBAfter))
11521152 then {
11531153 let $t03769037779 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
11541154 let tokensAmountA = $t03769037779._1
11551155 let tokensAmountB = $t03769037779._2
11561156 let $t03778239018 = if (isBorrowed)
11571157 then {
11581158 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
11591159 let debt = {
11601160 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
11611161 if ($isInstanceOf(@, "Int"))
11621162 then @
11631163 else throw(($getType(@) + " couldn't be cast to Int"))
11641164 }
11651165 if ((debt == debt))
11661166 then {
11671167 let amountToGetEx = if (if ((borrowAsset == idAStr))
11681168 then (debt > tokensAmountA)
11691169 else false)
11701170 then (debt - tokensAmountA)
11711171 else if (if ((borrowAsset == idBStr))
11721172 then (debt > tokensAmountB)
11731173 else false)
11741174 then (debt - tokensAmountB)
11751175 else 0
11761176 let exInv = if ((amountToGetEx > 0))
11771177 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
11781178 else nil
11791179 if ((exInv == exInv))
11801180 then {
11811181 let cBalAAfterRepay = accountBalance(idA)
11821182 if ((cBalAAfterRepay == cBalAAfterRepay))
11831183 then {
11841184 let cBalBAfterRepay = accountBalance(idB)
11851185 if ((cBalBAfterRepay == cBalBAfterRepay))
11861186 then {
11871187 let closeDbtInv = if ((debt > 0))
11881188 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
11891189 else 0
11901190 if ((closeDbtInv == closeDbtInv))
11911191 then if ((borrowAsset == idAStr))
11921192 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
11931193 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
11941194 else throw("Strict value is not equal to itself.")
11951195 }
11961196 else throw("Strict value is not equal to itself.")
11971197 }
11981198 else throw("Strict value is not equal to itself.")
11991199 }
12001200 else throw("Strict value is not equal to itself.")
12011201 }
12021202 else throw("Strict value is not equal to itself.")
12031203 }
12041204 else $Tuple2(tokensAmountA, tokensAmountB)
12051205 let toUserA = $t03778239018._1
12061206 let toUserB = $t03778239018._2
12071207 let poolTotalLoanEntries = if (isBorrowed)
12081208 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
12091209 else nil
12101210 let poolTotalMarketEntries = if (fromMarket)
12111211 then ([IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userCanWithdraw))] ++ (if (isBorrowed)
12121212 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
12131213 else nil))
12141214 else nil
12151215 let $t03943139826 = if (if ((withdrawToken == idAStr))
12161216 then (toUserB > 0)
12171217 else false)
12181218 then {
12191219 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserB, idBStr, idAStr)
12201220 if ((amtGet == amtGet))
12211221 then $Tuple2((toUserA + amtGet), 0)
12221222 else throw("Strict value is not equal to itself.")
12231223 }
12241224 else if (if ((withdrawToken == idBStr))
12251225 then (toUserA > 0)
12261226 else false)
12271227 then {
12281228 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserA, idAStr, idBStr)
12291229 if ((amtGet == amtGet))
12301230 then $Tuple2(0, (toUserB + amtGet))
12311231 else throw("Strict value is not equal to itself.")
12321232 }
12331233 else $Tuple2(toUserA, toUserB)
12341234 let toUserACalc = $t03943139826._1
12351235 let toUserBCalc = $t03943139826._2
12361236 let entries = ((([DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition)), DeleteEntry((((user + "_") + posId) + kUserPositionPool)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), IntegerEntry((pool + kPoolTotal), (poolTotalShare - userCanWithdraw)), ScriptTransfer(userAddr, toUserACalc, idA), ScriptTransfer(userAddr, toUserBCalc, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
12371237 $Tuple2(entries, [toUserACalc, toUserBCalc])
12381238 }
12391239 else throw("Strict value is not equal to itself.")
12401240 }
12411241 else throw("Strict value is not equal to itself.")
12421242 }
12431243 else throw("Strict value is not equal to itself.")
12441244 }
12451245 else throw("Strict value is not equal to itself.")
12461246 }
12471247 else throw("Strict value is not equal to itself.")
12481248 }
12491249
12501250
12511251 func liquidatePos (caller,user,posId,lAmount) = {
12521252 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
12531253 let borrowAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), "There are no borrow position")
12541254 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
12551255 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
12561256 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, true, fromMarket)
12571257 let poolTotalShare = getPoolTotalShare(pool)
12581258 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
12591259 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
12601260 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
12611261 let userAddr = Address(fromBase58String(user))
12621262 let poolAddr = Address(fromBase58String(pool))
12631263 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
12641264 let $t04175141823 = getPoolData(poolAddr, pType)
12651265 let idAStr = $t04175141823._1
12661266 let idBStr = $t04175141823._2
12671267 let balA = $t04175141823._3
12681268 let balB = $t04175141823._4
12691269 let shareId = $t04175141823._5
12701270 let $t04182641893 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
12711271 let idA = $t04182641893._1
12721272 let idB = $t04182641893._2
12731273 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12741274 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12751275 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
12761276 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
12771277 if ((borrowAmount == 0))
12781278 then throw("You can't liquidate position without borrow")
12791279 else {
12801280 let cBalABefore = accountBalance(idA)
12811281 if ((cBalABefore == cBalABefore))
12821282 then {
12831283 let cBalBBefore = accountBalance(idB)
12841284 if ((cBalBBefore == cBalBBefore))
12851285 then {
12861286 let inv = if ((pType == SF_POOL))
12871287 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
12881288 else if ((pType == WX_POOL))
12891289 then {
12901290 let inv = unstakeLP(pool, pType, shareId, userCanWithdraw, fromMarket)
12911291 if ((inv == inv))
12921292 then if ((proxyAddr == ""))
12931293 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12941294 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12951295 else throw("Strict value is not equal to itself.")
12961296 }
12971297 else unknownPoolType()
12981298 if ((inv == inv))
12991299 then {
13001300 let cBalAAfter = accountBalance(idA)
13011301 if ((cBalAAfter == cBalAAfter))
13021302 then {
13031303 let cBalBAfter = accountBalance(idB)
13041304 if ((cBalBAfter == cBalBAfter))
13051305 then {
13061306 let $t04307743166 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
13071307 let tokensAmountA = $t04307743166._1
13081308 let tokensAmountB = $t04307743166._2
13091309 let amountToGetEx = if (if ((borrowAsset == idAStr))
13101310 then (lAmount > tokensAmountA)
13111311 else false)
13121312 then (lAmount - tokensAmountA)
13131313 else if (if ((borrowAsset == idBStr))
13141314 then (lAmount > tokensAmountB)
13151315 else false)
13161316 then (lAmount - tokensAmountB)
13171317 else 0
13181318 let exInv = if ((amountToGetEx > 0))
13191319 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
13201320 else nil
13211321 if ((exInv == exInv))
13221322 then {
13231323 let cBalAAfterRepay = accountBalance(idA)
13241324 if ((cBalAAfterRepay == cBalAAfterRepay))
13251325 then {
13261326 let cBalBAfterRepay = accountBalance(idB)
13271327 if ((cBalBAfterRepay == cBalBAfterRepay))
13281328 then {
13291329 let $t04367243899 = if ((borrowAsset == idAStr))
13301330 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
13311331 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
13321332 let toUserA = $t04367243899._1
13331333 let toUserB = $t04367243899._2
13341334 let $t04390243979 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
13351335 let balAAfter = $t04390243979._1
13361336 let balBAfter = $t04390243979._2
13371337 let $t04398244113 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
13381338 let userStaked = $t04398244113._1
13391339 let axlyFee = $t04398244113._2
13401340 let userLpLiqudated = (userCanWithdraw - userStaked)
13411341 let $t04417244517 = if (fromMarket)
13421342 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
13431343 else $Tuple2(poolInterestLoan, nil)
13441344 let curPoolInterest = $t04417244517._1
13451345 let poolTotalMarketEntries = $t04417244517._2
13461346 $Tuple2((([IntegerEntry((pool + kPoolTotal), (poolTotalShare - userLpLiqudated)), IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userLpLiqudated)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (pAmount - userLpLiqudated)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), curPoolInterest), ScriptTransfer(caller, lAmount, assetIdFromStr(borrowAsset))] ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil)), userLpLiqudated)
13471347 }
13481348 else throw("Strict value is not equal to itself.")
13491349 }
13501350 else throw("Strict value is not equal to itself.")
13511351 }
13521352 else throw("Strict value is not equal to itself.")
13531353 }
13541354 else throw("Strict value is not equal to itself.")
13551355 }
13561356 else throw("Strict value is not equal to itself.")
13571357 }
13581358 else throw("Strict value is not equal to itself.")
13591359 }
13601360 else throw("Strict value is not equal to itself.")
13611361 }
13621362 else throw("Strict value is not equal to itself.")
13631363 }
13641364 }
13651365
13661366
13671367 func parseRequest (requestId) = {
13681368 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
13691369 let user = request[0]
13701370 let pool = request[1]
13711371 let pmtA = parseIntValue(request[2])
13721372 let AId = request[3]
13731373 let pmtB = parseIntValue(request[4])
13741374 let BId = request[5]
13751375 let balA = parseIntValue(request[6])
13761376 let balB = parseIntValue(request[7])
13771377 let shareId = request[8]
13781378 let bwAsset = request[9]
13791379 let bwAmount = parseIntValue(request[10])
13801380 let stakeToMarket = (request[11] == "true")
13811381 $Tuple12(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount, stakeToMarket)
13821382 }
13831383
13841384
13851385 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
13861386 then (borrowId != bId)
13871387 else false)
13881388 then throw("Wrong borrow asset")
13891389 else {
13901390 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
13911391 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
13921392 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
13931393 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
13941394 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
13951395 let $t04624546342 = if ((borrowId == aId))
13961396 then $Tuple2(dPriceA, decPrA)
13971397 else $Tuple2(dPriceB, decPrB)
13981398 let borrowPrice = $t04624546342._1
13991399 let borrowDecPr = $t04624546342._2
14001400 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
14011401 }
14021402
14031403
14041404 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
14051405 then if ((assetIdToStr(pmts[0].assetId) != AId))
14061406 then throw("Wrong payment asset A")
14071407 else if ((assetIdToStr(pmts[1].assetId) != BId))
14081408 then throw("Wrong payment asset B")
14091409 else $Tuple2(pmts[0].amount, pmts[1].amount)
14101410 else if ((size(pmts) == 1))
14111411 then if ((assetIdToStr(pmts[0].assetId) == AId))
14121412 then $Tuple2(pmts[0].amount, 0)
14131413 else if ((assetIdToStr(pmts[0].assetId) == BId))
14141414 then $Tuple2(0, pmts[0].amount)
14151415 else throw("Wrong payment")
14161416 else throw("One or two payments expected")
14171417
14181418
14191419 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
14201420 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
14211421 if ((0 > pri))
14221422 then (pri * -1)
14231423 else pri
14241424 }
14251425
14261426
14271427 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
14281428 let $t04734248022 = if (claim)
14291429 then claimFarmed(pType, pool)
14301430 else {
14311431 let claimedAsset = if ((pType == SF_POOL))
14321432 then SWOPID
14331433 else if ((pType == WX_POOL))
14341434 then {
14351435 let proxyAddrStr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
14361436 let inv = if ((proxyAddrStr != ""))
14371437 then {
14381438 let proxyAddr = addressFromStringValue(proxyAddrStr)
14391439 let proxyBalance = assetBalance(proxyAddr, WXID)
14401440 if ((proxyBalance > 0))
14411441 then invoke(proxyAddr, "wxClaimFinalized", [proxyBalance], nil)
14421442 else unit
14431443 }
14441444 else unit
14451445 if ((inv == inv))
14461446 then WXID
14471447 else throw("Strict value is not equal to itself.")
14481448 }
14491449 else unknownPoolType()
14501450 $Tuple2(amount, claimedAsset)
14511451 }
14521452 if (($t04734248022 == $t04734248022))
14531453 then {
14541454 let claimAsset = $t04734248022._2
14551455 let claimAmount = $t04734248022._1
14561456 let bal = accountBalance(claimAsset)
14571457 if ((bal == bal))
14581458 then if ((amount > bal))
14591459 then throw("To big amount to exchange")
14601460 else $Tuple2(claimAmount, claimAsset)
14611461 else throw("Strict value is not equal to itself.")
14621462 }
14631463 else throw("Strict value is not equal to itself.")
14641464 }
14651465
14661466
14671467 @Callable(i)
14681468 func getPoolInfoREADONLY (pool) = {
14691469 let poolAddr = addressFromStringValue(pool)
14701470 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
14711471 let $t04838948479 = getPoolData(Address(fromBase58String(pool)), pType)
14721472 let AId = $t04838948479._1
14731473 let BId = $t04838948479._2
14741474 let balA = $t04838948479._3
14751475 let balB = $t04838948479._4
14761476 let shareId = $t04838948479._5
14771477 let shareSupply = getShareSupply(poolAddr, pType, shareId)
14781478 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
14791479 }
14801480
14811481
14821482
14831483 @Callable(i)
14841484 func getShareAssetPriceREADONLY (shareId) = {
14851485 let sharePrices = getSharePrice(shareId)
14861486 $Tuple2(nil, sharePrices)
14871487 }
14881488
14891489
14901490
14911491 @Callable(i)
14921492 func getUserPositionShareAmountREADONLY (user,posNum) = {
14931493 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
14941494 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
14951495 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum) + kUserPositionInPMarket)), false)
14961496 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0), fromMarket)
14971497 $Tuple2(nil, userCanWithdraw)
14981498 }
14991499
15001500
15011501
15021502 @Callable(i)
15031503 func getUserPositionREADONLY (user,pools,posNum) = {
15041504 func userPos (a,pool) = {
15051505 let $t04947749547 = a
15061506 let wAmountsA = $t04947749547._1
15071507 let wAmountsB = $t04947749547._2
15081508 let debts = $t04947749547._3
15091509 let eqWAmountsA = $t04947749547._4
15101510 let eqWAmountsB = $t04947749547._5
15111511 let index = $t04947749547._6
15121512 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
15131513 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
15141514 else {
15151515 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
15161516 let $t04982649916 = getPoolData(Address(fromBase58String(pool)), pType)
15171517 let AId = $t04982649916._1
15181518 let BId = $t04982649916._2
15191519 let balA = $t04982649916._3
15201520 let balB = $t04982649916._4
15211521 let shareId = $t04982649916._5
15221522 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
15231523 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
15241524 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
15251525 let $t05026650386 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
15261526 let wAmountA = $t05026650386._1
15271527 let wAmountB = $t05026650386._2
15281528 if ((borrowAmount > 0))
15291529 then {
15301530 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
15311531 let debt = {
15321532 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
15331533 if ($isInstanceOf(@, "Int"))
15341534 then @
15351535 else throw(($getType(@) + " couldn't be cast to Int"))
15361536 }
15371537 if ((debt == debt))
15381538 then {
15391539 let amountToGetEx = if (if ((borrowAsset == AId))
15401540 then (debt > wAmountA)
15411541 else false)
15421542 then (debt - wAmountA)
15431543 else if (if ((borrowAsset == BId))
15441544 then (debt > wAmountB)
15451545 else false)
15461546 then (debt - wAmountB)
15471547 else 0
15481548 let amountToPay = if ((amountToGetEx > 0))
15491549 then if ((pType == SF_POOL))
15501550 then {
15511551 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
15521552 ex._2
15531553 }
15541554 else if ((pType == WX_POOL))
15551555 then {
15561556 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
15571557 ex._2
15581558 }
15591559 else unknownPoolType()
15601560 else 0
15611561 let $t05129851517 = if ((borrowAsset == AId))
15621562 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
15631563 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
15641564 let eqWAmountA = $t05129851517._1
15651565 let eqWAmountB = $t05129851517._2
15661566 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
15671567 }
15681568 else throw("Strict value is not equal to itself.")
15691569 }
15701570 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
15711571 }
15721572 }
15731573
15741574 let $t05177251883 = {
15751575 let $l = pools
15761576 let $s = size($l)
15771577 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
15781578 func $f0_1 ($a,$i) = if (($i >= $s))
15791579 then $a
15801580 else userPos($a, $l[$i])
15811581
15821582 func $f0_2 ($a,$i) = if (($i >= $s))
15831583 then $a
15841584 else throw("List size exceeds 20")
15851585
15861586 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
15871587 }
15881588 let wAmountsA = $t05177251883._1
15891589 let wAmountsB = $t05177251883._2
15901590 let debts = $t05177251883._3
15911591 let eqWAmountsA = $t05177251883._4
15921592 let eqWAmountsB = $t05177251883._5
15931593 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
15941594 }
15951595
15961596
15971597
15981598 @Callable(i)
15991599 func replenish (pool,leverage,borrowId,stakeToMarket) = valueOrElse(isActiveForUsers(), {
16001600 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
16011601 if (!(isPoolActive(pool, pType)))
16021602 then throw("Pool not active at this moment")
16031603 else if (if ((100 > leverage))
16041604 then true
16051605 else (leverage > 300))
16061606 then throw("Leverage can't be <100 and >300")
16071607 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
16081608 then (leverage > 100)
16091609 else false)
16101610 then throw("You can't borrow in this pool")
16111611 else if (if (stakeToMarket)
16121612 then !(valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false))
16131613 else false)
16141614 then throw("This pool can't stake to puzzle market")
16151615 else {
16161616 let $t05264252732 = getPoolData(Address(fromBase58String(pool)), pType)
16171617 let AId = $t05264252732._1
16181618 let BId = $t05264252732._2
16191619 let balA = $t05264252732._3
16201620 let balB = $t05264252732._4
16211621 let shareId = $t05264252732._5
16221622 if (if ((borrowId != AId))
16231623 then (borrowId != BId)
16241624 else false)
16251625 then throw("Wrong borrow asset")
16261626 else {
16271627 let $t05281352872 = parseReplenishPmts(i.payments, AId, BId)
16281628 let pmtA = $t05281352872._1
16291629 let pmtB = $t05281352872._2
16301630 let user = toString(i.caller)
16311631 let newPosNum = getNewUserPositionNumber(user)
16321632 if ((leverage > 100))
16331633 then {
16341634 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
16351635 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
16361636 let newRequestId = {
16371637 let @ = invoke(this, "createNewRequest", [request], nil)
16381638 if ($isInstanceOf(@, "Int"))
16391639 then @
16401640 else throw(($getType(@) + " couldn't be cast to Int"))
16411641 }
16421642 if ((newRequestId == newRequestId))
16431643 then {
16441644 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
16451645 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
16461646 if ((inv == inv))
16471647 then {
16481648 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
16491649 let $t05389553989 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
16501650 if (($t05389553989 == $t05389553989))
16511651 then {
16521652 let newBalB = $t05389553989._2
16531653 let newBalA = $t05389553989._1
16541654 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
16551655 let $t05405954174 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
16561656 let wAmountA = $t05405954174._1
16571657 let wAmountB = $t05405954174._2
16581658 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
16591659 }
16601660 else throw("Strict value is not equal to itself.")
16611661 }
16621662 else throw("Strict value is not equal to itself.")
16631663 }
16641664 else throw("Strict value is not equal to itself.")
16651665 }
16661666 else {
16671667 let $t05422754357 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
16681668 if (($t05422754357 == $t05422754357))
16691669 then {
16701670 let axlyFee = $t05422754357._2
16711671 let userStaked = $t05422754357._1
16721672 let $t05436354457 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
16731673 if (($t05436354457 == $t05436354457))
16741674 then {
16751675 let newBalB = $t05436354457._2
16761676 let newBalA = $t05436354457._1
16771677 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
16781678 let $t05452754642 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
16791679 let wAmountA = $t05452754642._1
16801680 let wAmountB = $t05452754642._2
16811681 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
16821682 }
16831683 else throw("Strict value is not equal to itself.")
16841684 }
16851685 else throw("Strict value is not equal to itself.")
16861686 }
16871687 }
16881688 }
16891689 })
16901690
16911691
16921692
16931693 @Callable(i)
16941694 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
16951695 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
16961696 if (!(isPoolActive(pool, pType)))
16971697 then throw("Pool not active at this moment")
16981698 else withdrawToUser(toString(i.caller), pool, toString(posId), false, "")
16991699 })
17001700
17011701
17021702
17031703 @Callable(i)
17041704 func withdrawOneToken (pool,posId,tokenId) = valueOrElse(isActiveForUsers(), {
17051705 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
17061706 if (!(isPoolActive(pool, pType)))
17071707 then throw("Pool not active at this moment")
17081708 else withdrawToUser(toString(i.caller), pool, toString(posId), false, tokenId)
17091709 })
17101710
17111711
17121712
17131713 @Callable(i)
17141714 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
17151715 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
17161716 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
17171717 if (!(isPoolActive(poolId, pType)))
17181718 then throw("Pool not active at this moment")
17191719 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
17201720 then throw("There are no user position")
17211721 else if ((0 >= price))
17221722 then throw("Price must be greater than 0")
17231723 else if ((price > tokenOraclePrice))
17241724 then throw("Price must be less than current token price")
17251725 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
17261726 })
17271727
17281728
17291729
17301730 @Callable(i)
17311731 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
17321732 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
17331733 if (!(isPoolActive(poolId, pType)))
17341734 then throw("Pool not active at this moment")
17351735 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
17361736 then throw("No entry")
17371737 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
17381738 })
17391739
17401740
17411741
17421742 @Callable(i)
17431743 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
17441744 then throw("Already inited")
17451745 else if (!(isDefined(addressFromString(moneyBoxAddr))))
17461746 then throw("moneyBoxAddr is not correct address")
17471747 else if (!(isDefined(addressFromString(sfFarmingAddr))))
17481748 then throw("sfFarmingAddr is not correct address")
17491749 else if (!(isDefined(addressFromString(lendAddr))))
17501750 then throw("lendAddr is not correct address")
17511751 else if (!(isDefined(addressFromString(priceOracleAddr))))
17521752 then throw("priceOracleAddr is not correct address")
17531753 else if (!(isDefined(addressFromString(keeperExContract))))
17541754 then throw("keeperExContract is not correct address")
17551755 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
17561756 then throw("swopAssetId is not correct asset id")
17571757 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
17581758 then throw("swopAssetId is not correct asset id")
17591759 else if ((size(fromBase58String(operatorPubKey)) != 32))
17601760 then throw("operatorPubKey is not correct")
17611761 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
17621762 then throw("group1Admin1PubKey is not correct")
17631763 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
17641764 then throw("group1Admin2PubKey is not correct")
17651765 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
17661766 then throw("group2Admin1PubKey is not correct")
17671767 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
17681768 then throw("group2Admin2PubKey is not correct")
17691769 else [StringEntry(kMoneyBox, moneyBoxAddr), StringEntry(kSFFarmingAddr, sfFarmingAddr), StringEntry(kLendService, lendAddr), StringEntry(kPriceOracle, priceOracleAddr), StringEntry(kExContract, keeperExContract), StringEntry(kWxSwapContract, wxSwapContract), StringEntry(kSwopId, swopAssetId), StringEntry(kWxId, wxAssetId), StringEntry(kOperatorCallPK, operatorPubKey), StringEntry(kGroup1Admin1PK, group1Admin1PubKey), StringEntry(kGroup1Admin2PK, group1Admin2PubKey), StringEntry(kGroup2Admin1PK, group2Admin1PubKey), StringEntry(kGroup2Admin2PK, group2Admin2PubKey)])
17701770
17711771
17721772
17731773 @Callable(i)
17741774 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
17751775 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
17761776 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
17771777 })
17781778
17791779
17801780
17811781 @Callable(i)
17821782 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
17831783 let $t05986259981 = parseRequest(requestId)
17841784 let user = $t05986259981._1
17851785 let pool = $t05986259981._2
17861786 let pmtA = $t05986259981._3
17871787 let AId = $t05986259981._4
17881788 let pmtB = $t05986259981._5
17891789 let BId = $t05986259981._6
17901790 let balA = $t05986259981._7
17911791 let balB = $t05986259981._8
17921792 let shareId = $t05986259981._9
17931793 let bwAsset = $t05986259981._10
17941794 let bwAmount = $t05986259981._11
17951795 let stakeToMarket = $t05986259981._12
17961796 if ((size(i.payments) != 1))
17971797 then throw("Wrong payment size")
17981798 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
17991799 then true
18001800 else (i.payments[0].amount != bwAmount))
18011801 then throw("Wrong payment")
18021802 else {
18031803 let $t06017160271 = if ((AId == bwAsset))
18041804 then $Tuple2((pmtA + bwAmount), pmtB)
18051805 else $Tuple2(pmtA, (pmtB + bwAmount))
18061806 let pmtAllA = $t06017160271._1
18071807 let pmtAllB = $t06017160271._2
18081808 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
18091809 let $t06035360483 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
18101810 let userStaked = $t06035360483._1
18111811 let axlyFee = $t06035360483._2
18121812 let posNum = getNewUserPositionNumber(user)
18131813 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
18141814 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
18151815 let $t06085860973 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
18161816 let wAmountA = $t06085860973._1
18171817 let wAmountB = $t06085860973._2
18181818 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
18191819 }
18201820 }))
18211821
18221822
18231823
18241824 @Callable(i)
18251825 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), liquidatePos(i.caller, user, posId, liquidateAmount)))
18261826
18271827
18281828
18291829 @Callable(i)
18301830 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
18311831 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
18321832 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
18331833 if ((tokenOraclePrice > stopLossPrice))
18341834 then throw("Token price greater stop loss price")
18351835 else {
18361836 let res = withdrawToUser(user, pool, toString(posId), true, "")
18371837 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
18381838 }
18391839 }))
18401840
18411841
18421842
18431843 @Callable(i)
18441844 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
18451845 let pType = getStringValue(this, (kPool + pool))
18461846 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
18471847 let poolAddr = Address(fromBase58String(pool))
18481848 let $t06238962455 = getPoolData(poolAddr, pType)
18491849 let AId = $t06238962455._1
18501850 let BId = $t06238962455._2
18511851 let balA = $t06238962455._3
18521852 let balB = $t06238962455._4
18531853 let shareId = $t06238962455._5
18541854 let totalShareAmount = getPoolTotalShare(pool)
18551855 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
18561856 let $t06258463415 = if ((amountToExchange > 0))
18571857 then {
18581858 let $t06264662748 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
18591859 if (($t06264662748 == $t06264662748))
18601860 then {
18611861 let claimedAsset = $t06264662748._2
18621862 let claimedAmount = $t06264662748._1
18631863 let rArgs = split(route, "__")
18641864 let exchangedAmount = if ((amountToExchange > 0))
18651865 then if ((rArgs[0] == "directSwopfiCPMM"))
18661866 then directSwopfiCPMM(rArgs, tokenToId)
18671867 else if ((rArgs[0] == "routingSwopfi"))
18681868 then directRoutingSwopfi(rArgs, tokenToId)
18691869 else throw("Wrong route")
18701870 else 0
18711871 if ((exchangedAmount == exchangedAmount))
18721872 then {
18731873 let newChange = ((claimedAmount + change) - amountToExchange)
18741874 let changeEntry = if ((newChange >= 0))
18751875 then [IntegerEntry((pool + kPoolCapChange), newChange)]
18761876 else nil
18771877 let $t06324563355 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
18781878 let capEnterise = $t06324563355._1
18791879 let staked = $t06324563355._2
18801880 $Tuple2((capEnterise ++ changeEntry), staked)
18811881 }
18821882 else throw("Strict value is not equal to itself.")
18831883 }
18841884 else throw("Strict value is not equal to itself.")
18851885 }
18861886 else $Tuple2(nil, 0)
18871887 let capEnterise = $t06258463415._1
18881888 let staked = $t06258463415._2
18891889 let $t06341863535 = if (isMarketPool)
18901890 then capitalizePuzzleMarket(pool, pType, shareId)
18911891 else $Tuple2(nil, 0)
18921892 let marketCapEnteris = $t06341863535._1
18931893 let stakedMarket = $t06341863535._2
18941894 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
18951895 }))
18961896
18971897
18981898
18991899 @Callable(i)
19001900 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19011901 let pType = getStringValue(this, (kPool + pool))
19021902 let poolAddr = Address(fromBase58String(pool))
19031903 let $t06397064036 = getPoolData(poolAddr, pType)
19041904 let AId = $t06397064036._1
19051905 let BId = $t06397064036._2
19061906 let balA = $t06397064036._3
19071907 let balB = $t06397064036._4
19081908 let shareId = $t06397064036._5
1909- let $t06403964137 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1910- if (($t06403964137 == $t06403964137))
1909+ let totalShareAmount = getPoolTotalShare(pool)
1910+ let $t06408864186 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1911+ if (($t06408864186 == $t06408864186))
19111912 then {
1912- let claimedAsset = $t06403964137._2
1913- let claimedAmount = $t06403964137._1
1914- capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance), AId, BId, balA, balB, shareId)
1913+ let claimedAsset = $t06408864186._2
1914+ let claimedAmount = $t06408864186._1
1915+ let $t06418964335 = capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance), AId, BId, balA, balB, shareId)
1916+ let capEnterise = $t06418964335._1
1917+ let staked = $t06418964335._2
1918+ (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
19151919 }
19161920 else throw("Strict value is not equal to itself.")
19171921 }))
19181922
19191923
19201924
19211925 @Callable(i)
19221926 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow,canPMarket) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
19231927 then (type != WX_POOL)
19241928 else false)
19251929 then throw("Wrong type")
19261930 else if (if ((poolType != CPMM))
19271931 then (poolType != FLAT)
19281932 else false)
19291933 then throw("Wrong pool type")
19301934 else {
1931- let $t06474464838 = getPoolData(Address(fromBase58String(poolAddr)), type)
1932- let aId = $t06474464838._1
1933- let bId = $t06474464838._2
1934- let aBal = $t06474464838._3
1935- let bBal = $t06474464838._4
1936- let shareId = $t06474464838._5
1935+ let $t06495865052 = getPoolData(Address(fromBase58String(poolAddr)), type)
1936+ let aId = $t06495865052._1
1937+ let bId = $t06495865052._2
1938+ let aBal = $t06495865052._3
1939+ let bBal = $t06495865052._4
1940+ let shareId = $t06495865052._5
19371941 if ((0 > inFeeNoLoan))
19381942 then throw("inFeeNoLoan must be greater than 0")
19391943 else if ((0 > inFeeLoan))
19401944 then throw("inFeeLoan must be greater than 0")
19411945 else if ((0 > capFeeNoLoan))
19421946 then throw("capFeeNoLoan must be greater than 0")
19431947 else if ((0 > capFeeWithLoan))
19441948 then throw("capFeeWithLoan must be greater than 0")
19451949 else if ((0 > stoplossFeeNoLoan))
19461950 then throw("stoplossFeeNoLoan must be greater than 0")
19471951 else if ((0 > stoplossFeeWithLoan))
19481952 then throw("stoplossFeeWithLoan must be greater than 0")
19491953 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((poolAddr + kPoolType), poolType), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow), BooleanEntry((poolAddr + kPoolPMArket), canPMarket)]
19501954 }))
19511955
19521956
19531957
19541958 @Callable(i)
19551959 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
19561960 then throw(("Can't find pool with addr " + poolAddr))
19571961 else if ((0 > inFeeNoLoan))
19581962 then throw("inFeeNoLoan must be greater than 0")
19591963 else if ((0 > inFeeLoan))
19601964 then throw("inFeeLoan must be greater than 0")
19611965 else if ((0 > capFeeNoLoan))
19621966 then throw("capFeeNoLoan must be greater than 0")
19631967 else if ((0 > capFeeWithLoan))
19641968 then throw("capFeeWithLoan must be greater than 0")
19651969 else if ((0 > stoplossFeeNoLoan))
19661970 then throw("stoplossFeeNoLoan must be greater than 0")
19671971 else if ((0 > stoplossFeeWithLoan))
19681972 then throw("stoplossFeeWithLoan must be greater than 0")
19691973 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan)]))
19701974
19711975
19721976
19731977 @Callable(i)
19741978 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
19751979 then throw("dApp already active")
19761980 else [BooleanEntry(kActive, true)])
19771981
19781982
19791983
19801984 @Callable(i)
19811985 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
19821986 then throw("dApp already shutdown")
19831987 else [BooleanEntry(kActive, false)])
19841988
19851989
19861990
19871991 @Callable(i)
19881992 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
19891993 then throw("dApp already active for users")
19901994 else [BooleanEntry(kActiveUsers, true)])
19911995
19921996
19931997
19941998 @Callable(i)
19951999 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
19962000 then throw("dApp already shutdown for users")
19972001 else [BooleanEntry(kActiveUsers, false)])
19982002
19992003
20002004
20012005 @Callable(i)
20022006 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
20032007 then throw("SWOPFI already active")
20042008 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
20052009
20062010
20072011
20082012 @Callable(i)
20092013 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
20102014 then throw("SWOPFI already shutdown")
20112015 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
20122016
20132017
20142018
20152019 @Callable(i)
20162020 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
20172021 then throw("WX already active")
20182022 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
20192023
20202024
20212025
20222026 @Callable(i)
20232027 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
20242028 then throw("WX already shutdown")
20252029 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
20262030
20272031
20282032
20292033 @Callable(i)
20302034 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
20312035 then throw("Unknown pool")
20322036 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
20332037 then throw("Pool already active")
20342038 else [BooleanEntry((pool + kPoolActive), true)])
20352039
20362040
20372041
20382042 @Callable(i)
20392043 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
20402044 then throw("Unknown pool")
20412045 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
20422046 then throw("Pool already shutdown")
20432047 else [BooleanEntry((pool + kPoolActive), false)])
20442048
20452049
20462050 @Verifier(tx)
20472051 func verify () = {
20482052 let multiSignedByAdmins = {
20492053 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
20502054 then 1
20512055 else 0
20522056 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group1Admin2PK))
20532057 then 1
20542058 else 0
20552059 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], group1Admin3PK))
20562060 then 1
20572061 else 0
20582062 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
20592063 }
20602064 multiSignedByAdmins
20612065 }
20622066

github/deemru/w8io/6500d08 
171.23 ms