tx · 3WpS4ezCtFKyAScRtTXzy1oScwekqyZfxxdYjMho6uBs

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.07600000 Waves

2024.04.08 11:42 [4119506] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "3WpS4ezCtFKyAScRtTXzy1oScwekqyZfxxdYjMho6uBs", "fee": 7600000, "feeAssetId": null, "timestamp": 1712565787419, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "", "63YuBZCy4GvCX3BKY9ykCsY75Zzbrjx4mP1LS1NLCRyfVDZMtmoZXP9rSX6Fjpj9hebi69d7vyfGeGwaZUFFR4By", "5bQNPrmLMFWTY9Kb5zRASmwfeN9UNXExmjB7ybRY9aNNTwQYeBEGiwKeKSZU8mLL8n5YamkPV3WXQeRKCdFzawsX" ], "script": "base64:BgKsAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBgoECAEIBBIECgIIARIFCgMIAQgSBgoEAQgIARIFCgMBCAgSDwoNCAgICAgICAgICAgICBIDCgEIEgMKAQgSBQoDCAgBEgYKBAgBCAgSBwoFCAgIAQQSBQoDCAQBEg4KDAgICAEBAQEBAQQECBIJCgcIAQEBAQEBEgASABIAEgASABIAEgASABIDCgEIEgMKAQibAQAEQ09ORgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIGY29uZmlnAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gABENQTU0CBGNwbW0ABEZMQVQCBGZsYXQAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAWa1VzZXJQb3NpdGlvbkluUE1hcmtldAIUX3VzZXJQb3NpdGlvblBNYXJrZXQACmtQb29sVG90YWwCCl9wb29sVG90YWwADmtQb29sVG90YWxMb2FuAg5fcG9vbFRvdGFsTG9hbgAQa1Bvb2xUb3RhbE1hcmtldAIQX3Bvb2xUb3RhbE1hcmtldAAUa1Bvb2xUb3RhbE1hcmtldExvYW4CFF9wb29sVG90YWxNYXJrZXRMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4AF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAhdfcG9vbEludGVyZXN0TWFya2V0TG9hbgAZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgIZX3Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAYa1Bvb2xBbGxvd2VkQm9ycm93QXNzZXRzAhhfcG9vbEFsbG93ZWRCb3Jyb3dBc3NldHMADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAMa1Bvb2xQTUFya2V0AhFfcG9vbFB1enpsZU1hcmtldAAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAJa1Bvb2xUeXBlAglfcG9vbFR5cGUACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCF19mYWxsYmFja0V4Y2hhbmdlU3dvcGZpAA5rUG9vbFByb3h5QWRkcgIRX3Bvb2xQcm94eUFkZHJlc3MACWtNb25leUJveAIOYXhseV9tb25leV9ib3gADmtTRkZhcm1pbmdBZGRyAhNzd29wZmlfZmFybWluZ19hZGRyAAxrTGVuZFNlcnZpY2UCEWxlbmRfc2VydmljZV9hZGRyAA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAC2tFeENvbnRyYWN0AhFleGNoYW5nZV9jb250cmFjdAAPa1d4U3dhcENvbnRyYWN0AhB3eF9zd2FwX2NvbnRyYWN0AAdrV3hSZXN0Agx3eF9yZXN0X2FkZHIAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAMa1BNYXJrZXRBZGRyAhVwdXp6bGVfbWFya2V0X2FkZHJlc3MAEGtQTWFya2V0UmVzdEFkZHICGnB1enpsZV9tYXJrZXRfcmVzdF9hZGRyZXNzAA9rR3JvdXAxQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAPa0dyb3VwMUFkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjNQSwIVZ3JvdXAxX2FkbWluM19wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGd3hSZXN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1d4UmVzdAISTm8gd3ggcmVzdCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFBWtXeElkAghObyB3eCBpZAALcE1hcmtldEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQxrUE1hcmtldEFkZHICGE5vIHB1enpsZSBtYXJrZXQgYWRkcmVzcwAPcE1hcmtldFJlc3RBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUQa1BNYXJrZXRSZXN0QWRkcgIdTm8gcHV6emxlIG1hcmtldCByZXN0IGFkZHJlc3MADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMUFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4zUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4zUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDGtMZW5kU2VydmljZQIbQ2FuJ3QgZ2V0IGxlbmQgc2VydmljZSBhZGRyAQ5pc09wZXJhdG9yQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBgkAAAIIBQFpBmNhbGxlcgUIbW9uZXlCb3gFBHVuaXQJAAIBAiRPbmx5IG9wZXJhdG9yIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BC2lzQWRtaW5DYWxsAQFpAwMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMVBLBgkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4yUEsFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzTGFuZENhbGwBAWkDCQAAAggFAWkGY2FsbGVyCQEOZ2V0TGVuZFNydkFkZHIABQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCGlzQWN0aXZlAAMJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGBgUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBEGlzQWN0aXZlRm9yVXNlcnMAAwMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYGBwUEdW5pdAkAAgECKURBcHAgaXMgaW5hY3RpdmUgZm9yIHVzZXJzIGF0IHRoaXMgbW9tZW50AQxpc1Bvb2xBY3RpdmUCBHBvb2wEdHlwZQQKV1hTRkFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHR5cGUFC2tBY3RpdmVTRldYBgQKcG9vbEFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgMDBQpXWFNGQWN0aXZlBQpwb29sQWN0aXZlBwYHAQ5hY2NvdW50QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA8AcCBQR0aGlzBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAAIBAgtNYXRjaCBlcnJvcgERZ2V0U0ZQb29sQmFsYW5jZXMBCHBvb2xBZGRyCQCUCgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEFBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEEgYXNzZXQgYmFsYW5jZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQkFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBiYWxhbmNlARFnZXRXWFBvb2xCYWxhbmNlcwMIcG9vbEFkZHIDYUlkA2JJZAkAlAoCCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNhSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYklkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBD2dldFBvb2xCYWxhbmNlcwQIcG9vbEFkZHIEdHlwZQNhSWQDYklkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAkBD3Vua25vd25Qb29sVHlwZQABDWdldFNGUG9vbERhdGEBCHBvb2xBZGRyBAskdDA5NzM5OTc4OAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgULJHQwOTczOTk3ODgFCyR0MDk3Mzk5Nzg4BARiYWxCCAULJHQwOTczOTk3ODgCXzIEBGJhbEEIBQskdDA5NzM5OTc4OAJfMQkAlwoFCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xBQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQkFzc2V0SWQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQFBGJhbEEFBGJhbEIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUOa1NGUG9vbFNoYXJlSWQCGENhbid0IGdldCBzaGFyZSBhc3NldCBpZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgENZ2V0V1hQb29sRGF0YQEIcG9vbEFkZHIEA2NmZwoAAUAJAPwHBAUIcG9vbEFkZHICHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNjZmcFA2NmZwQDYUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAEAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAQDYklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAFAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAQHc2hhcmVJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcAAwMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGkNhbid0IGdldCBwb29sIExQIGFzc2V0IGlkBA0kdDAxMDQ4NTEwNTQ0CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgUNJHQwMTA0ODUxMDU0NAUNJHQwMTA0ODUxMDU0NAQEYmFsQggFDSR0MDEwNDg1MTA1NDQCXzIEBGJhbEEIBQ0kdDAxMDQ4NTEwNTQ0Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTM1MzMxMzU5OAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMzUzMzEzNTk4Al8xBANiSWQIBQ0kdDAxMzUzMzEzNTk4Al8yBAhhQmFsYW5jZQgFDSR0MDEzNTMzMTM1OTgCXzMECGJCYWxhbmNlCAUNJHQwMTM1MzMxMzU5OAJfNAQGcHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQHZFByaWNlQQkAkQMCBQZwcmljZXMAAAQHZFByaWNlQgkAkQMCBQZwcmljZXMAAQQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkBANzdW0DAwkAZgIFB2RQcmljZUEAAAkAZgIFB2RQcmljZUIAAAcJAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgMJAGYCBQdkUHJpY2VBAAAJAGgCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24AAgMJAGYCBQdkUHJpY2VCAAAJAGgCCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24AAgD///////////8BAwkAZgIAAAUDc3VtAP///////////wEJAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQEOZ2V0U2hhcmVQcmljZXMBCHNoYXJlSWRzCgEJZ2V0UHJpY2VzAgFhB3NoYXJlSWQJAM0IAgUBYQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCgACJGwFCHNoYXJlSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEOZ2V0Q3Vyc0VudHJpZXMEA2FJZANiSWQHc2hhcmVJZAh3QW1vdW50cwQMYXNzZXRzUHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQKc2hhcmVQcmljZQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkBAZwcmljZXMJAM4IAgkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsBQh3QW1vdW50cwkAzAgCCQELU3RyaW5nRW50cnkCBQ9rVG9rZW5MYXN0UHJpY2UJALkJAgUGcHJpY2VzAgEsBQNuaWwBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFcFR5cGUIcG9vbEFkZHIETFBJZARwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCQCRAwIFBHJlcGwAAgoAAUAJAJEDAgUEcmVwbAAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTUzNTMxNTYxOQkAlAoCCQC1CQIKAAFACQD8BwQFBnd4UmVzdAIkcG9vbEV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwkAtQkCCgABQAkA/AcEBQZ3eFJlc3QCI3Bvb2xFdmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxNTM1MzE1NjE5BQ0kdDAxNTM1MzE1NjE5BApldmFsUHV0SW5CCAUNJHQwMTUzNTMxNTYxOQJfMgQKZXZhbFB1dEluQQgFDSR0MDE1MzUzMTU2MTkCXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUHCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGxwSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNhSWQFBHBtdEEJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2JJZAUEcG10QgUDbmlsBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwkAzAgCCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgIDcHV0CQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgIUd3hSZXBsZW5pc2hUd29Ub2tlbnMJAMwIAgkApQgBBQhwb29sQWRkcgkAzAgCBQRscElkCQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUFCHBvb2xBZGRyBXBUeXBlA3BtdAVwbXRJZARscElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmZjAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQlrUG9vbFR5cGUCBGNwbW0FBEZMQVQCC3B1dE9uZVRrblYyAglwdXRPbmVUa24DCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIcG9vbEFkZHIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICE3d4UmVwbGVuaXNoT25lVG9rZW4JAMwIAgkApQgBBQhwb29sQWRkcgkAzAgCBQRscElkCQDMCAIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABB3N0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQNc3Rha2VUb01hcmtldAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sUHJveHlBZGRyAgADBQ1zdGFrZVRvTWFya2V0CQD8BwQFC3BNYXJrZXRBZGRyAgZzdXBwbHkFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIZmFybUFkZHICBXN0YWtlBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgIJd3hTdGFrZUxwCQDMCAIJAKUIAQUIZmFybUFkZHIFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAAQl1bnN0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQKZnJvbU1hcmtldAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQNJHQwMTgzNTYxOTAzOAMFCmZyb21NYXJrZXQJAJUKAwULcE1hcmtldEFkZHICCHdpdGhkcmF3CQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAJUKAwkBEGdldFNGRmFybWluZ0FkZHIAAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAwkAAAIFCXByb3h5QWRkcgIACQCVCgMFCGZhcm1BZGRyAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAJUKAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAgt3eFVuc3Rha2VMcAkAzAgCCQClCAEFCGZhcm1BZGRyCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE4MzU2MTkwMzgCXzEEBWZOYW1lCAUNJHQwMTgzNTYxOTAzOAJfMgQGcGFyYW1zCAUNJHQwMTgzNTYxOTAzOAJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxOTQ2MDE5NzY2AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE5NDYwMTk3NjYCXzEECmFzc2V0VG9QYXkIBQ0kdDAxOTQ2MDE5NzY2Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAEQZ2V0V1hQb29sUmV2ZXJzZQMIcG9vbEFkZHIHYXNzZXRJbghhc3NldE91dAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDGxwTm9uUmV2ZXJzZQoAAUAJAPwHBAUJZkNvbnRyYWN0AiBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQkAzAgCBQdhc3NldEluCQDMCAIFCGFzc2V0T3V0BQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQECWxwUmV2ZXJzZQoAAUAJAPwHBAUJZkNvbnRyYWN0AiBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQkAzAgCBQhhc3NldE91dAkAzAgCBQdhc3NldEluBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQDCQECIT0CBQxscE5vblJldmVyc2UFBHVuaXQHAwkBAiE9AgUJbHBSZXZlcnNlBQR1bml0BgkAAgECEVBvb2wgaXMgbm90IGV4aXN0AQ1jYWxjRmxhdFRvUGF5BwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQHYXNzZXRJbgMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBQhhc3NldElkQgUIYXNzZXRJZEEECGFtb3V0R2V0CgABQAkA/AcEBQ53eFN3YXBDb250cmFjdAIVc3dhcENhbGN1bGF0ZVJFQURPTkxZCQDMCAIFEGFtb3VudFRva2VuVG9HZXQJAMwIAgUHYXNzZXRJbgkAzAgCBQ9hc3NldFRva2VuVG9HZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQhhbW91dEdldAUIYW1vdXRHZXQDCQAAAgUIYW1vdXRHZXQFEGFtb3VudFRva2VuVG9HZXQJAJQKAgUHYXNzZXRJbgUQYW1vdW50VG9rZW5Ub0dldAQNJHQwMjEzNzkyMTgzOAQDYVBNAwkAZgIFEGFtb3VudFRva2VuVG9HZXQFCGFtb3V0R2V0CQBrAwUQYW1vdW50VG9rZW5Ub0dldABuAGQJAGsDBRBhbW91bnRUb2tlblRvR2V0AFoAZAQMYW1vdW50R2V0TWF4CgABQAkA/AcEBQ53eFN3YXBDb250cmFjdAIVc3dhcENhbGN1bGF0ZVJFQURPTkxZCQDMCAIFA2FQTQkAzAgCBQdhc3NldEluCQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDGFtb3VudEdldE1heAUMYW1vdW50R2V0TWF4AwkAZgIFEGFtb3VudFRva2VuVG9HZXQFDGFtb3VudEdldE1heAkAlAoCBQNhUE0JAGsDBQNhUE0AbgBkCQCUCgIFEGFtb3VudFRva2VuVG9HZXQFA2FQTQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQOYW1vdW50VG9QYXlNaW4IBQ0kdDAyMTM3OTIxODM4Al8xBA5hbW91bnRUb1BheU1heAgFDSR0MDIxMzc5MjE4MzgCXzIKAQNoZG0CAWEFaW5kZXgEDSR0MDIxODg1MjE5MDYFAWEEA3BheQgFDSR0MDIxODg1MjE5MDYCXzEEBnBheU1heAgFDSR0MDIxODg1MjE5MDYCXzIEB3BheU5leHQJAGkCCQBkAgUDcGF5BQZwYXlNYXgAAgQNYW1vdW50R2V0TmV4dAoAAUAJAPwHBAUOd3hTd2FwQ29udHJhY3QCFXN3YXBDYWxjdWxhdGVSRUFET05MWQkAzAgCBQdwYXlOZXh0CQDMCAIFB2Fzc2V0SW4JAMwIAgUPYXNzZXRUb2tlblRvR2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUNYW1vdW50R2V0TmV4dAUNYW1vdW50R2V0TmV4dAMJAGYCBRBhbW91bnRUb2tlblRvR2V0BQ1hbW91bnRHZXROZXh0CQCUCgIFB3BheU5leHQFBnBheU1heAkAlAoCBQNwYXkFB3BheU5leHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDHJlc0FtbnRUb1BheQoAAiRsCQDMCAIAAQkAzAgCAAIFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUOYW1vdW50VG9QYXlNaW4FDmFtb3VudFRvUGF5TWF4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNoZG0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACBAthbW91bnRUb1BheQMJAGYCBRBhbW91bnRUb2tlblRvR2V0BQhhbW91dEdldAgFDHJlc0FtbnRUb1BheQJfMggFDHJlc0FtbnRUb1BheQJfMQkAlAoCBQdhc3NldEluBQthbW91bnRUb1BheQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAyMjUwMjIyNTQxCQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAyMjUwMjIyNTQxAl8xBAVwckZlZQgFDSR0MDIyNTAyMjI1NDECXzIECHBvb2xUeXBlCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUJa1Bvb2xUeXBlBQRDUE1NBAhmZWVTY2FsZQkAtgIBAIDC1y8DCQAAAgUIcG9vbFR5cGUFBEZMQVQJAQ1jYWxjRmxhdFRvUGF5BwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQEDSR0MDIyNzc0MjMwODIDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxCCQBlAgUEYmFsQQUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEIEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQQkAZQIFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDIyNzc0MjMwODICXzEECmFzc2V0VG9QYXkIBQ0kdDAyMjc3NDIzMDgyAl8yBBJhbW91bnRUb1BheVdpdGhGZWUJAKADAQkAvQIECQC2AgEFC2Ftb3VudFRvUGF5BQhmZWVTY2FsZQkAuAICBQhmZWVTY2FsZQkAtgIBCQBkAgUFcHJGZWUFBHBGZWUFB0NFSUxJTkcJAJQKAgUKYXNzZXRUb1BheQUSYW1vdW50VG9QYXlXaXRoRmVlARBleGNoYW5nZURpcmVjdGx5CAVwVHlwZQRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQGcG9vbEZCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCAAMDCQAAAgUFcFR5cGUFB1NGX1BPT0wGCQECIT0CBQZwb29sRkICAAQNJHQwMjM1MjMyMzczNQMJAAACBQZwb29sRkICAAkAlQoDBQRiYWxBBQRiYWxCBQRwb29sBA0kdDAyMzYyOTIzNzAyCQERZ2V0U0ZQb29sQmFsYW5jZXMBCQERQGV4dHJOYXRpdmUoMTA2MikBBQZwb29sRkIEBnNmQmFsQQgFDSR0MDIzNjI5MjM3MDICXzEEBnNmQmFsQggFDSR0MDIzNjI5MjM3MDICXzIJAJUKAwUGc2ZCYWxBBQZzZkJhbEIFBnBvb2xGQgQFcEJhbEEIBQ0kdDAyMzUyMzIzNzM1Al8xBAVwQmFsQggFDSR0MDIzNTIzMjM3MzUCXzIEBmV4UG9vbAgFDSR0MDIzNTIzMjM3MzUCXzMEDSR0MDIzNzQwMjM4NjYJARFjYWxjQW1vdW50VG9QYXlTRgcFBmV4UG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQVwQmFsQQUFcEJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDIzNzQwMjM4NjYCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMjM3NDAyMzg2NgJfMgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQZleFBvb2wCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIJAKQDAQUQYW1vdW50VG9rZW5Ub0dldAUDbmlsBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDI0MDY4MjQxOTAJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUEYmFsQQUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMjQwNjgyNDE5MAJfMQQLYW1vdW50VG9QYXkIBQ0kdDAyNDA2ODI0MTkwAl8yCQD8BwQFDnd4U3dhcENvbnRyYWN0AgRzd2FwCQDMCAIFEGFtb3VudFRva2VuVG9HZXQJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAEVZXhjaGFuZ2VEaXJlY3RseU5vTGltBQVwVHlwZQRwb29sDWFtb3VudFRva2VuRXgOYXNzZXRUb2tlblRvRXgPYXNzZXRUb2tlblRvR2V0BAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFD2Fzc2V0VG9rZW5Ub0dldAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQGcG9vbEZCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCAAQDaW52AwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABAZleFBvb2wDCQAAAgUGcG9vbEZCAgAFBHBvb2wFBnBvb2xGQgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQZleFBvb2wCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAICATEFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQ5hc3NldFRva2VuVG9FeAUNYW1vdW50VG9rZW5FeAUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFDnd4U3dhcENvbnRyYWN0AgRzd2FwCQDMCAIAAQkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFDmFzc2V0VG9rZW5Ub0V4BQ1hbW91bnRUb2tlbkV4BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUPYXNzZXRUb2tlblRvR2V0AwkAAAIFCGJhbEFmdGVyBQhiYWxBZnRlcgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAhwb29sQWRkcgVwVHlwZQdzaGFyZUlkD3VzZXJDYW5XaXRoZHJhdwQNJHQwMjUzMTkyNTc5MAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICEHdpdGhkcmF3UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDaW52BQNpbnYJAJQKAgoAAUAJAJEDAgUDaW52AAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQNpbnYAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkAtQkCCgABQAkA/AcEBQZ3eFJlc3QCF3Bvb2xFdmFsdWF0ZUdldFJFQURPTkxZCQDMCAIFB3NoYXJlSWQJAMwIAgUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFA2ludgUDaW52CQCUCgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2ludgACCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAQHYW1vdW50QQgFDSR0MDI1MzE5MjU3OTACXzEEB2Ftb3VudEIIBQ0kdDAyNTMxOTI1NzkwAl8yCQCUCgIFB2Ftb3VudEEFB2Ftb3VudEIBC2NsYWltRmFybWVkAgVwVHlwZQRwb29sBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MBAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFBlNXT1BJRAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQDaW52CQD8BwQJARBnZXRTRkZhcm1pbmdBZGRyAAIFY2xhaW0JAMwIAgUEcG9vbAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQJAJQKAgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUFBlNXT1BJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMjYyMzAyNjMwOQkBDWdldFdYUG9vbERhdGEBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBANhSWQIBQ0kdDAyNjIzMDI2MzA5Al8xBANiSWQIBQ0kdDAyNjIzMDI2MzA5Al8yBARhQmFsCAUNJHQwMjYyMzAyNjMwOQJfMwQEYkJhbAgFDSR0MDI2MjMwMjYzMDkCXzQEBGxwSWQIBQ0kdDAyNjIzMDI2MzA5Al81BAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFBFdYSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEA2ludgMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhmYXJtQWRkcgIHY2xhaW1XeAkAzAgCBQRscElkBQNuaWwFA25pbAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICDXd4Q2xhaW1GYXJtZWQJAMwIAgkApQgBBQhmYXJtQWRkcgkAzAgCBQRscElkBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFBFdYSUQJAJQKAgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUFBFdYSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAQ9yZXBsZW5pc2hCeVR5cGULBXBUeXBlBHBvb2wHZmVlVHlwZQRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIETFBJZAtzdGFrZU1hcmtldAQPbHBCYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQDCQAAAgUPbHBCYWxhbmNlQmVmb3JlBQ9scEJhbGFuY2VCZWZvcmUECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBA0kdDAyNzExNDI3NTQyAwMJAGYCBQRwbXRBAAAJAGYCBQRwbXRCAAAHBA0kdDAyNzE4MDI3MzAyCQEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCQUFcFR5cGUFCHBvb2xBZGRyBQRMUElkBQRwbXRBBQNhSWQFBHBtdEIFA2JJZAUEYmFsQQUEYmFsQgQGcG10SW5BCAUNJHQwMjcxODAyNzMwMgJfMQQGcG10SW5CCAUNJHQwMjcxODAyNzMwMgJfMgQGY2hhbmdlCAUNJHQwMjcxODAyNzMwMgJfMwQIY2hhbmdlSWQIBQ0kdDAyNzE4MDI3MzAyAl80BANpbnYJARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUHBQhwb29sQWRkcgUFcFR5cGUFBnBtdEluQQUDYUlkBQZwbXRJbkIFA2JJZAUETFBJZAMJAAACBQNpbnYFA2ludgkAlAoCBQZjaGFuZ2UFCGNoYW5nZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAZgIFBHBtdEEAAAkAlAoCBQRwbXRBBQNhSWQDCQBmAgUEcG10QgAACQCUCgIFBHBtdEIFA2JJZAkAAgECEHBtdHMgbXVzdCBiZSA+IDAEBmNoYW5nZQgFDSR0MDI3MTE0Mjc1NDICXzEECGNoYW5nZUlkCAUNJHQwMjcxMTQyNzU0MgJfMgQDaW52AwkAZgIFBmNoYW5nZQAACQEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUFBQhwb29sQWRkcgUFcFR5cGUFBmNoYW5nZQUIY2hhbmdlSWQFBExQSWQFA25pbAMJAAACBQNpbnYFA2ludgQObHBCYWxhbmNlQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAQLdG90YWxTdGFrZWQJAGUCBQ5scEJhbGFuY2VBZnRlcgUPbHBCYWxhbmNlQmVmb3JlBA1heGx5RmVlQW1vdW50CQBrAwULdG90YWxTdGFrZWQJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgQRdXNlclNoYXJlRm9yU3Rha2UJAGUCBQt0b3RhbFN0YWtlZAUNYXhseUZlZUFtb3VudAMJAGcCAAAFEXVzZXJTaGFyZUZvclN0YWtlCQACAQIoYW1vdW50IG9mIHN0YWtlZCBzaGFyZXRva2VucyBtdXN0IGJlID4gMAQFaW52TFAJAQdzdGFrZUxQBQUEcG9vbAUFcFR5cGUFBExQSWQFEXVzZXJTaGFyZUZvclN0YWtlBQtzdGFrZU1hcmtldAMJAAACBQVpbnZMUAUFaW52TFAJAJQKAgURdXNlclNoYXJlRm9yU3Rha2UFDWF4bHlGZWVBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEHJlcGxlbmlzaEVudHJpZXMJBHBvb2wEdXNlcgxzdGFrZWRBbW91bnQNYXhseUZlZUFtb3VudAZwb3NOdW0Hc2hhcmVJZAR0eXBlCHdpdGhMb2FuDXN0YWtlVG9NYXJrZXQEC3RvdGFsQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA90b3RhbEFtb3VudExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxBbW91bnRNYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEFXRvdGFsQW1vdW50TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAAEEnBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQQcG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEGHBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQWcG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEDSR0MDI5MDAzMjk4MjgDBQh3aXRoTG9hbgMFDXN0YWtlVG9NYXJrZXQJAJQKAgUWcG9vbEludGVyZXN0TWFya2V0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBkAgURdG90YWxBbW91bnRNYXJrZXQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgkAZAIFFXRvdGFsQW1vdW50TWFya2V0TG9hbgUMc3Rha2VkQW1vdW50CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFmtVc2VyUG9zaXRpb25JblBNYXJrZXQGBQNuaWwJAJQKAgUQcG9vbEludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50BQNuaWwDBQ1zdGFrZVRvTWFya2V0CQCUCgIFGHBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBkAgURdG90YWxBbW91bnRNYXJrZXQFDHN0YWtlZEFtb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BgUDbmlsCQCUCgIFEnBvb2xJbnRlcmVzdE5vTG9hbgUDbmlsBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyOTAwMzI5ODI4Al8xBAdhZEVudHJ5CAUNJHQwMjkwMDMyOTgyOAJfMgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBQt0b3RhbEFtb3VudAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FDWtVc2VyUG9zaXRpb24FDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QFD2N1clBvb2xJbnRlcmVzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wFBHBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQUGcG9zTnVtCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ1heGx5RmVlQW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAUHYWRFbnRyeQEJbGlzdFRvSW50AgFhBGl0ZW0JAM0IAgUBYQkBDXBhcnNlSW50VmFsdWUBBQRpdGVtARBkaXJlY3RTd29wZmlDUE1NAgVyQXJncwd0b2tlblRvBARkQXBwCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBXJBcmdzAAEEBHBtdFAJALUJAgkAkQMCBQVyQXJncwACAgF8BBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQLbWluVG9SZWNpdmUJAJEDAgUFckFyZ3MAAwQDaW52CQD8BwQFBGRBcHACDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIFC21pblRvUmVjaXZlBQNuaWwFA25pbAUDcG10AwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARNkaXJlY3RSb3V0aW5nU3dvcGZpAgVyQXJncwd0b2tlblRvBARkQXBwCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBXJBcmdzAAEEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDcG10BARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBCQCRAwIFBHBtdFAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBHBtdFAAAQUDbmlsBARhcmdzBAVlQXJncwkAtQkCCQCRAwIFBXJBcmdzAAMCAXwECmV4Y2hhbmdlcnMJALUJAgkAkQMCBQVlQXJncwAAAgEsBA5leGNoYW5nZXJzVHlwZQkAtQkCCQCRAwIFBWVBcmdzAAECASwEBWFyZ3MxCgACJGwJALUJAgkAkQMCBQVlQXJncwACAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlsaXN0VG9JbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMEBWFyZ3MyCgACJGwJALUJAgkAkQMCBQVlQXJncwADAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlsaXN0VG9JbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMEEXJvdXRpbmdBc3NldHNLZXlzCQC1CQIJAJEDAgUFZUFyZ3MABAIBLAQLbWluVG9SZWNpdmUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVlQXJncwAFCQDMCAIFCmV4Y2hhbmdlcnMJAMwIAgUOZXhjaGFuZ2Vyc1R5cGUJAMwIAgUFYXJnczEJAMwIAgUFYXJnczIJAMwIAgURcm91dGluZ0Fzc2V0c0tleXMJAMwIAgULbWluVG9SZWNpdmUFA25pbAQDaW52CQD8BwQFBGRBcHACDHJvdXRpbmdUcmFkZQUEYXJncwUDcG10AwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQpjYXBpdGFsaXplCQRwb29sBXBUeXBlB3Rva2VuSWQLdG9rZW5BbW91bnQDQUlkA0JJZARiYWxBBGJhbEIHc2hhcmVJZAMDCQECIT0CBQd0b2tlbklkBQNBSWQJAQIhPQIFB3Rva2VuSWQFA0JJZAcJAAIBAgtXcm9uZyBhc3NldAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAMJAAACBRB0b3RhbFNoYXJlQW1vdW50AAAJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULdG9rZW5BbW91bnQJANkEAQUHdG9rZW5JZAUDbmlsAAAEGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAMJAGYCAAAJAGUCCQBlAgUQdG90YWxTaGFyZUFtb3VudAURdG90YWxNYXJrZXRBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgkAAgECQ0Vycm9yIHdpdGggc2hhcmUgYW1vdW50IHRvdGFsU2hhcmVBbW91bnQgPCB0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4EC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRF0b3RhbE1hcmtldEFtb3VudAQQdG9rZW5zRm9yRmVlTG9hbgkAawMFC3Rva2VuQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BBJ0b2tlbnNGb3JGZWVOb0xvYW4JAGUCBQt0b2tlbkFtb3VudAUQdG9rZW5zRm9yRmVlTG9hbgQLYXhseUZlZUxvYW4JAGsDBRB0b2tlbnNGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQNYXhseUZlZU5vTG9hbgkAawMFEnRva2Vuc0ZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEB2F4bHlGZWUJAGQCBQtheGx5RmVlTG9hbgUNYXhseUZlZU5vTG9hbgQNJHQwMzI5MDYzMzAwNgMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlAAAJAJQKAgAACQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUEBHBtdEEIBQ0kdDAzMjkwNjMzMDA2Al8xBARwbXRCCAUNJHQwMzI5MDYzMzAwNgJfMgQNJHQwMzMwMDkzMzEyMAkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQZOT19GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBwQMc3Rha2VkQW1vdW50CAUNJHQwMzMwMDkzMzEyMAJfMQQCbmYIBQ0kdDAzMzAwOTMzMTIwAl8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQpzdGFrZWRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQdheGx5RmVlCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlbklkBQNuaWwFDHN0YWtlZEFtb3VudAEWY2FwaXRhbGl6ZVB1enpsZU1hcmtldAMEcG9vbAVwVHlwZQdzaGFyZUlkBBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA1tYXJrZXRCYWxhbmNlCQDwBwIFC3BNYXJrZXRBZGRyCQDZBAEFB3NoYXJlSWQDCQAAAgUNbWFya2V0QmFsYW5jZQUNbWFya2V0QmFsYW5jZQQPbWFya2V0QXZhaWxhYmxlCgABQAkA/AcEBQ9wTWFya2V0UmVzdEFkZHICHGFzc2V0U3VwcGx5QnlBZGRyZXNzUkVBRE9OTFkJAMwIAgkApQgBBQtwTWFya2V0QWRkcgkAzAgCBQdzaGFyZUlkCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFD21hcmtldEF2YWlsYWJsZQUPbWFya2V0QXZhaWxhYmxlBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAADAwkAAAIFEXRvdGFsTWFya2V0QW1vdW50AAAJAGYCBQ9tYXJrZXRBdmFpbGFibGUAAAcEDnVuc3Rha2VkQW1vdW50CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD21hcmtldEF2YWlsYWJsZQYDCQAAAgUOdW5zdGFrZWRBbW91bnQFDnVuc3Rha2VkQW1vdW50AwkAZgIFDW1hcmtldEJhbGFuY2UFDnVuc3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDnVuc3Rha2VkQW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAAACQCUCgIFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAljYXBBbW91bnQJAGUCBQ9tYXJrZXRBdmFpbGFibGUFEXRvdGFsTWFya2V0QW1vdW50AwkAZwIAAAUJY2FwQW1vdW50CQCUCgIFA25pbAAABBFtYXJrZXRMb2FuUGVyY2VudAkAawMFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FBlNDQUxFOAURdG90YWxNYXJrZXRBbW91bnQEFnRva2Vuc01hcmtldEZvckZlZUxvYW4JAGsDBQljYXBBbW91bnQFEW1hcmtldExvYW5QZXJjZW50BQZTQ0FMRTgEG3Rva2Vuc01hcmtldEZvckZvckZlZU5vTG9hbgkAZQIFCWNhcEFtb3VudAUWdG9rZW5zTWFya2V0Rm9yRmVlTG9hbgQRYXhseU1hcmtldEZlZUxvYW4JAGsDBRZ0b2tlbnNNYXJrZXRGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQTYXhseU1hcmtldEZlZU5vTG9hbgkAawMFG3Rva2Vuc01hcmtldEZvckZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlNYXJrZXRGZWUJAGQCBRFheGx5TWFya2V0RmVlTG9hbgUTYXhseU1hcmtldEZlZU5vTG9hbgMJAGYCBQ1heGx5TWFya2V0RmVlBQ1tYXJrZXRCYWxhbmNlCQCUCgIFA25pbAAABBJzdGFrZWRNYXJrZXRBbW91bnQJAGUCBQljYXBBbW91bnQFDWF4bHlNYXJrZXRGZWUEEHN0YWtlZE1hcmtldExvYW4JAGsDBRJzdGFrZWRNYXJrZXRBbW91bnQFEW1hcmtldExvYW5QZXJjZW50BQZTQ0FMRTgEEnN0YWtlZE1hcmtldE5vTG9hbgkAZQIFEnN0YWtlZE1hcmtldEFtb3VudAUQc3Rha2VkTWFya2V0TG9hbgQZY3VyUG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEG2N1clBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQVbmV3SW50ZXJlc3RNYXJrZXRMb2FuAwkAZgIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAkAZAIFGWN1clBvb2xJbnRlcmVzdE1hcmtldExvYW4JAGsDBRBzdGFrZWRNYXJrZXRMb2FuBQdTQ0FMRTEwBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAEF25ld0ludGVyZXN0TWFya2V0Tm9Mb2FuAwkAZgIJAGUCBRF0b3RhbE1hcmtldEFtb3VudAUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgAACQBkAgUbY3VyUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQBrAwUSc3Rha2VkTWFya2V0Tm9Mb2FuBQdTQ0FMRTEwCQBlAgURdG90YWxNYXJrZXRBbW91bnQFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAQOdW5zdGFrZWRBbW91bnQJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUNYXhseU1hcmtldEZlZQYDCQAAAgUOdW5zdGFrZWRBbW91bnQFDnVuc3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4FFW5ld0ludGVyZXN0TWFya2V0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuBRduZXdJbnRlcmVzdE1hcmtldE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBkAgURdG90YWxNYXJrZXRBbW91bnQFEnN0YWtlZE1hcmtldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgkAZAIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FEHN0YWtlZE1hcmtldExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlNYXJrZXRGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFA25pbAUSc3Rha2VkTWFya2V0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBHVzZXIEcG9vbAVwb3NJZAhib3Jyb3dlZAtpc01hcmtldFBvcwQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQMdXNlckludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAQScG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABBBwb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAQMcG9vbEludGVyZXN0AwUIYm9ycm93ZWQDBQtpc01hcmtldFBvcwUWcG9vbEludGVyZXN0TWFya2V0TG9hbgUQcG9vbEludGVyZXN0TG9hbgMFC2lzTWFya2V0UG9zBRhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4FEnBvb2xJbnRlcmVzdE5vTG9hbgkAZAIFB3BBbW91bnQJAGsDBQdwQW1vdW50CQBlAgUMcG9vbEludGVyZXN0BQx1c2VySW50ZXJlc3QFB1NDQUxFMTABD2NhbGNTdG9wTG9zc0ZlZQQEcG9vbAppc0JvcnJvd2VkCHN0b3BMb3NzCmxwV2l0aGRyYXcEB2ZlZVR5cGUDBQppc0JvcnJvd2VkBQ1TVE9QTE9TU19MT0FOBRRTVE9QTE9TU19GRUVfTk9fTE9BTgMFCHN0b3BMb3NzCQBrAwUKbHBXaXRoZHJhdwkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2AAABDndpdGhkcmF3VG9Vc2VyBQR1c2VyBHBvb2wFcG9zSWQIc3RvcExvc3MNd2l0aGRyYXdUb2tlbgQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQKZnJvbU1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQFCmZyb21NYXJrZXQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAABAh1c2VyQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHVzZXIECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDM5MTc0MzkyNDYJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQGaWRBU3RyCAUNJHQwMzkxNzQzOTI0NgJfMQQGaWRCU3RyCAUNJHQwMzkxNzQzOTI0NgJfMgQEYmFsQQgFDSR0MDM5MTc0MzkyNDYCXzMEBGJhbEIIBQ0kdDAzOTE3NDM5MjQ2Al80BAdzaGFyZUlkCAUNJHQwMzkxNzQzOTI0NgJfNQQNJHQwMzkyNDkzOTMxNgkAlAoCCQEOYXNzZXRJZEZyb21TdHIBBQZpZEFTdHIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQlN0cgQDaWRBCAUNJHQwMzkyNDkzOTMxNgJfMQQDaWRCCAUNJHQwMzkyNDkzOTMxNgJfMgQLc3RvcExvc3NGZWUJAQ9jYWxjU3RvcExvc3NGZWUEBQRwb29sBQppc0JvcnJvd2VkBQhzdG9wTG9zcwUPdXNlckNhbldpdGhkcmF3BAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABAtjQmFsQUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFC2NCYWxBQmVmb3JlBQtjQmFsQUJlZm9yZQQLY0JhbEJCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQtjQmFsQkJlZm9yZQULY0JhbEJCZWZvcmUEA2ludgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFC3N0b3BMb3NzRmVlBQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52CQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEJAGUCBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlBQNuaWwFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAZAIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFCmZyb21NYXJrZXQDCQAAAgUDaW52BQNpbnYDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIcG9vbEFkZHICA2dldAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICE3d4V2l0aGRyYXdUd29Ub2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZpZEFTdHIJAMwIAgUGaWRCU3RyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDA0MDMyNDQwNDEzCQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwNDAzMjQ0MDQxMwJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDQwMzI0NDA0MTMCXzIEDSR0MDQwNDE2NDE2NjEDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAkAzAgCBQdzaGFyZUlkBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFC2JvcnJvd0Fzc2V0BQRkZWJ0BQNuaWwAAAMJAAACBQtjbG9zZURidEludgULY2xvc2VEYnRJbnYDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAlAoCCQBlAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUFBGRlYnQJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlCQCUCgIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlCQBlAgkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUFBGRlYnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUNdG9rZW5zQW1vdW50QQUNdG9rZW5zQW1vdW50QgQHdG9Vc2VyQQgFDSR0MDQwNDE2NDE2NjECXzEEB3RvVXNlckIIBQ0kdDA0MDQxNjQxNjYxAl8yBBRwb29sVG90YWxMb2FuRW50cmllcwMFCmlzQm9ycm93ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwEFnBvb2xUb3RhbE1hcmtldEVudHJpZXMDBQpmcm9tTWFya2V0CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BQ91c2VyQ2FuV2l0aGRyYXcFA25pbAMFCmlzQm9ycm93ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGUCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwEDSR0MDQyMDc0NDI0NjkDAwkAAAIFDXdpdGhkcmF3VG9rZW4FBmlkQVN0cgkAZgIFB3RvVXNlckIAAAcEBmFtdEdldAkBFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFBXBUeXBlBQRwb29sBQd0b1VzZXJCBQZpZEJTdHIFBmlkQVN0cgMJAAACBQZhbXRHZXQFBmFtdEdldAkAlAoCCQBkAgUHdG9Vc2VyQQUGYW10R2V0AAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DAwkAAAIFDXdpdGhkcmF3VG9rZW4FBmlkQlN0cgkAZgIFB3RvVXNlckEAAAcEBmFtdEdldAkBFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFBXBUeXBlBQRwb29sBQd0b1VzZXJBBQZpZEFTdHIFBmlkQlN0cgMJAAACBQZhbXRHZXQFBmFtdEdldAkAlAoCAAAJAGQCBQd0b1VzZXJCBQZhbXRHZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUHdG9Vc2VyQQUHdG9Vc2VyQgQLdG9Vc2VyQUNhbGMIBQ0kdDA0MjA3NDQyNDY5Al8xBAt0b1VzZXJCQ2FsYwgFDSR0MDQyMDc0NDI0NjkCXzIEB2VudHJpZXMJAM4IAgkAzggCCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBRFrVXNlclBvc2l0aW9uUG9vbAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgUOcG9vbFRvdGFsU2hhcmUFD3VzZXJDYW5XaXRoZHJhdwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgULdG9Vc2VyQUNhbGMFA2lkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgULdG9Vc2VyQkNhbGMFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwUWcG9vbFRvdGFsTWFya2V0RW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFC3RvVXNlckFDYWxjCQDMCAIFC3RvVXNlckJDYWxjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGxpcXVpZGF0ZVBvcwQGY2FsbGVyBHVzZXIFcG9zSWQHbEFtb3VudAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBRFrVXNlclBvc2l0aW9uUG9vbAILbm8gcG9zaXRpb24EDGJvcnJvd0Ftb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQCHFRoZXJlIGFyZSBubyBib3Jyb3cgcG9zaXRpb24EB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24ECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAUFcG9zSWQGBQpmcm9tTWFya2V0BA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsTWFya2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4AAAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0NDM5NDQ0NDY2CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDQ0Mzk0NDQ0NjYCXzEEBmlkQlN0cggFDSR0MDQ0Mzk0NDQ0NjYCXzIEBGJhbEEIBQ0kdDA0NDM5NDQ0NDY2Al8zBARiYWxCCAUNJHQwNDQzOTQ0NDQ2NgJfNAQHc2hhcmVJZAgFDSR0MDQ0Mzk0NDQ0NjYCXzUEDSR0MDQ0NDY5NDQ1MzYJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDQ0NDY5NDQ1MzYCXzEEA2lkQggFDSR0MDQ0NDY5NDQ1MzYCXzIECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sUHJveHlBZGRyAgAEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQQcG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAAAwkAAAIFDGJvcnJvd0Ftb3VudAAACQACAQIrWW91IGNhbid0IGxpcXVpZGF0ZSBwb3NpdGlvbiB3aXRob3V0IGJvcnJvdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAgh3aXRoZHJhdwkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52AwkAAAIFCXByb3h5QWRkcgIACQD8BwQFCHBvb2xBZGRyAgNnZXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAhN3eFdpdGhkcmF3VHdvVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGaWRBU3RyCQDMCAIFBmlkQlN0cgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQADCQAAAgUDaW52BQNpbnYECmNCYWxBQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQpjQmFsQUFmdGVyBQpjQmFsQUFmdGVyBApjQmFsQkFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUKY0JhbEJBZnRlcgUKY0JhbEJBZnRlcgQNJHQwNDU3MjA0NTgwOQkAlAoCCQBlAgUKY0JhbEFBZnRlcgULY0JhbEFCZWZvcmUJAGUCBQpjQmFsQkFmdGVyBQtjQmFsQkJlZm9yZQQNdG9rZW5zQW1vdW50QQgFDSR0MDQ1NzIwNDU4MDkCXzEEDXRva2Vuc0Ftb3VudEIIBQ0kdDA0NTcyMDQ1ODA5Al8yBA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QQcJAGUCBQdsQW1vdW50BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QgcJAGUCBQdsQW1vdW50BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQNJHQwNDYzMTU0NjU0MgMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQCUCgIJAGUCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQUHbEFtb3VudAkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUJAJQKAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUJAGUCCQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQUHbEFtb3VudAQHdG9Vc2VyQQgFDSR0MDQ2MzE1NDY1NDICXzEEB3RvVXNlckIIBQ0kdDA0NjMxNTQ2NTQyAl8yBA0kdDA0NjU0NTQ2NjIyCQEPZ2V0UG9vbEJhbGFuY2VzBAUIcG9vbEFkZHIFBXBUeXBlBQZpZEFTdHIFBmlkQlN0cgQJYmFsQUFmdGVyCAUNJHQwNDY1NDU0NjYyMgJfMQQJYmFsQkFmdGVyCAUNJHQwNDY1NDU0NjYyMgJfMgQNJHQwNDY2MjU0Njc1NgkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQZOT19GRUUFB3RvVXNlckEFBmlkQVN0cgUHdG9Vc2VyQgUGaWRCU3RyBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQpmcm9tTWFya2V0BAp1c2VyU3Rha2VkCAUNJHQwNDY2MjU0Njc1NgJfMQQHYXhseUZlZQgFDSR0MDQ2NjI1NDY3NTYCXzIED3VzZXJMcExpcXVkYXRlZAkAZQIFD3VzZXJDYW5XaXRoZHJhdwUKdXNlclN0YWtlZAQNJHQwNDY4MTU0NzE2MAMFCmZyb21NYXJrZXQJAJQKAgUWcG9vbEludGVyZXN0TWFya2V0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBlAgURdG90YWxNYXJrZXRBbW91bnQFD3VzZXJMcExpcXVkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgkAZQIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FD3VzZXJMcExpcXVkYXRlZAUDbmlsCQCUCgIFEHBvb2xJbnRlcmVzdExvYW4FA25pbAQPY3VyUG9vbEludGVyZXN0CAUNJHQwNDY4MTU0NzE2MAJfMQQWcG9vbFRvdGFsTWFya2V0RW50cmllcwgFDSR0MDQ2ODE1NDcxNjACXzIJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJMcExpcXVkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUHcEFtb3VudAUPdXNlckxwTGlxdWRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAUPY3VyUG9vbEludGVyZXN0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUHbEFtb3VudAkBDmFzc2V0SWRGcm9tU3RyAQULYm9ycm93QXNzZXQFA25pbAUWcG9vbFRvdGFsTWFya2V0RW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAUPdXNlckxwTGlxdWRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoEDXN0YWtlVG9NYXJrZXQJAAACCQCRAwIFB3JlcXVlc3QACwIEdHJ1ZQkAngoMBQR1c2VyBQRwb29sBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAUHYndBc3NldAUIYndBbW91bnQFDXN0YWtlVG9NYXJrZXQBEGNhbGNCb3Jyb3dBbW91bnQIBHBtdEEEcG10QgRiYWxBBGJhbEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAQMcHJpY2VPcmFjbGVBCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNhSWQFDmtQcmljZUluT3JhY2xlAP///////////wEEDHByaWNlT3JhY2xlQgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYklkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BAwMJAQIhPQIFCGJvcnJvd0lkBQNhSWQJAQIhPQIFCGJvcnJvd0lkBQNiSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0AwMJAAACBQxwcmljZU9yYWNsZUEA////////////AQkAAAIFDHByaWNlT3JhY2xlQgD///////////8BBwkAAgECM0Nhbid0IGNhbGMgZGVwb3NpdCBwcmljZSwgbm8gdG9rZW4gcHJpY2VzIGluIG9yYWNsZQQGZGVjUHJBCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQGZGVjUHJCCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQHZFByaWNlQQMJAQIhPQIFDHByaWNlT3JhY2xlQQD///////////8BBQxwcmljZU9yYWNsZUEJAGsDCQBrAwUEYmFsQgUGZGVjUHJBBQRiYWxBBQxwcmljZU9yYWNsZUIFBmRlY1ByQgQHZFByaWNlQgMJAQIhPQIFDHByaWNlT3JhY2xlQgD///////////8BBQxwcmljZU9yYWNsZUIJAGsDCQBrAwUEYmFsQQUGZGVjUHJCBQRiYWxCBQxwcmljZU9yYWNsZUEFBmRlY1ByQQQMcGF5ZEluRG9sbGFyCQBkAgkAawMFB2RQcmljZUEFBHBtdEEFBmRlY1ByQQkAawMFB2RQcmljZUIFBHBtdEIFBmRlY1ByQgQNJHQwNDkzMDQ0OTQwMQMJAAACBQhib3Jyb3dJZAUDYUlkCQCUCgIFB2RQcmljZUEFBmRlY1ByQQkAlAoCBQdkUHJpY2VCBQZkZWNQckIEC2JvcnJvd1ByaWNlCAUNJHQwNDkzMDQ0OTQwMQJfMQQLYm9ycm93RGVjUHIIBQ0kdDA0OTMwNDQ5NDAxAl8yCQBrAwkAawMFDHBheWRJbkRvbGxhcgkAZQIFCGxldmVyYWdlAGQAZAULYm9ycm93RGVjUHIFC2JvcnJvd1ByaWNlARJwYXJzZVJlcGxlbmlzaFBtdHMDBHBtdHMDQUlkA0JJZAMJAAACCQCQAwEFBHBtdHMAAgMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBBAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAQdhc3NldElkBQNCSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEIJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAgJAJEDAgUEcG10cwABBmFtb3VudAMJAAACCQCQAwEFBHBtdHMAAQMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50AAADCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNCSWQJAJQKAgAACAkAkQMCBQRwbXRzAAAGYW1vdW50CQACAQINV3JvbmcgcGF5bWVudAkAAgECHE9uZSBvciB0d28gcGF5bWVudHMgZXhwZWN0ZWQBD2NhbGNQcmljZUltcGFjdAQEYmFsQQRiYWxCB25ld0JhbEEHbmV3QmFsQgQDcHJpCQBoAgkAZQIFBlNDQUxFOAkAawMJAGsDBQRiYWxCBQZTQ0FMRTgFBGJhbEEFBlNDQUxFOAkAawMFB25ld0JhbEIFBlNDQUxFOAUHbmV3QmFsQQBkAwkAZgIAAAUDcHJpCQBoAgUDcHJpAP///////////wEFA3ByaQERY2xhaW1BbmRDaGVja0FtbnQFBHBvb2wFcFR5cGUFY2xhaW0QYW1vdW50VG9FeGNoYW5nZRFhbW91bnRGcm9tQmFsYW5jZQQNJHQwNTA0MjI1MTI3MwMFBWNsYWltBAdjbGFpbWVkCQELY2xhaW1GYXJtZWQCBQVwVHlwZQUEcG9vbAMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAAJAJQKAgUQYW1vdW50VG9FeGNoYW5nZQgFB2NsYWltZWQCXzIJAJQKAgkAZAIIBQdjbGFpbWVkAl8xBRFhbW91bnRGcm9tQmFsYW5jZQgFB2NsYWltZWQCXzIEDGNsYWltZWRBc3NldAMJAAACBQVwVHlwZQUHU0ZfUE9PTAUGU1dPUElEAwkAAAIFBXBUeXBlBQdXWF9QT09MBAxwcm94eUFkZHJTdHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABANpbnYDCQECIT0CBQxwcm94eUFkZHJTdHICAAQJcHJveHlBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJTdHIEDHByb3h5QmFsYW5jZQkA8AcCBQlwcm94eUFkZHIFBFdYSUQDCQBmAgUMcHJveHlCYWxhbmNlAAAJAPwHBAUJcHJveHlBZGRyAhB3eENsYWltRmluYWxpemVkCQDMCAIFDHByb3h5QmFsYW5jZQUDbmlsBQNuaWwFBHVuaXQFBHVuaXQDCQAAAgUDaW52BQNpbnYFBFdYSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUACQCUCgIJAGQCBRBhbW91bnRUb0V4Y2hhbmdlBRFhbW91bnRGcm9tQmFsYW5jZQUMY2xhaW1lZEFzc2V0AwkAAAIFDSR0MDUwNDIyNTEyNzMFDSR0MDUwNDIyNTEyNzMEBWFzc2V0CAUNJHQwNTA0MjI1MTI3MwJfMgQGYW1vdW50CAUNJHQwNTA0MjI1MTI3MwJfMQQDYmFsCQEOYWNjb3VudEJhbGFuY2UBBQVhc3NldAMJAAACBQNiYWwFA2JhbAMJAGYCBQZhbW91bnQFA2JhbAkAAgECGVRvIGJpZyBhbW91bnQgdG8gZXhjaGFuZ2UJAJQKAgUGYW1vdW50BQVhc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhwBaQETZ2V0UG9vbEluZm9SRUFET05MWQEEcG9vbAQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDA1MTYyNTUxNzE1CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDUxNjI1NTE3MTUCXzEEA0JJZAgFDSR0MDUxNjI1NTE3MTUCXzIEBGJhbEEIBQ0kdDA1MTYyNTUxNzE1Al8zBARiYWxCCAUNJHQwNTE2MjU1MTcxNQJfNAQHc2hhcmVJZAgFDSR0MDUxNjI1NTE3MTUCXzUEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsCQCYCgYFA0FJZAUDQklkBQdzaGFyZUlkBQRiYWxBBQRiYWxCBQtzaGFyZVN1cHBseQFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQKZnJvbU1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAFCmZyb21NYXJrZXQJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEXZ2V0VXNlclBvc2l0aW9uUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDA1MjcxMzUyNzgzBQFhBAl3QW1vdW50c0EIBQ0kdDA1MjcxMzUyNzgzAl8xBAl3QW1vdW50c0IIBQ0kdDA1MjcxMzUyNzgzAl8yBAVkZWJ0cwgFDSR0MDUyNzEzNTI3ODMCXzMEC2VxV0Ftb3VudHNBCAUNJHQwNTI3MTM1Mjc4MwJfNAQLZXFXQW1vdW50c0IIBQ0kdDA1MjcxMzUyNzgzAl81BAVpbmRleAgFDSR0MDUyNzEzNTI3ODMCXzYDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFDWtVc2VyUG9zaXRpb24JAJgKBgkAzQgCBQl3QW1vdW50c0EAAAkAzQgCBQl3QW1vdW50c0IAAAkAzQgCBQVkZWJ0cwAACQDNCAIFC2VxV0Ftb3VudHNBAAAJAM0IAgULZXFXQW1vdW50c0IAAAkAZAIFBWluZGV4AAEEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDA1MzA2MjUzMTUyCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDUzMDYyNTMxNTICXzEEA0JJZAgFDSR0MDUzMDYyNTMxNTICXzIEBGJhbEEIBQ0kdDA1MzA2MjUzMTUyAl8zBARiYWxCCAUNJHQwNTMwNjI1MzE1MgJfNAQHc2hhcmVJZAgFDSR0MDUzMDYyNTMxNTICXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAUKZnJvbU1hcmtldAQNJHQwNTM1MDI1MzYyMgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcECHdBbW91bnRBCAUNJHQwNTM1MDI1MzYyMgJfMQQId0Ftb3VudEIIBQ0kdDA1MzUwMjUzNjIyAl8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAGYCBQRkZWJ0BQh3QW1vdW50QQcJAGUCBQRkZWJ0BQh3QW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFA0JJZAkAZgIFBGRlYnQFCHdBbW91bnRCBwkAZQIFBGRlYnQFCHdBbW91bnRCAAAEC2Ftb3VudFRvUGF5AwkAZgIFDWFtb3VudFRvR2V0RXgAAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yAwkAAAIFBXBUeXBlBQdXWF9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIJAQ91bmtub3duUG9vbFR5cGUAAAAEDSR0MDU0NTM0NTQ3NTMDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAlAoCCQBlAgkAZAIFCHdBbW91bnRBBQ1hbW91bnRUb0dldEV4BQRkZWJ0CQBlAgUId0Ftb3VudEIFC2Ftb3VudFRvUGF5CQCUCgIJAGUCBQh3QW1vdW50QQULYW1vdW50VG9QYXkJAGUCCQBkAgUId0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFBGRlYnQECmVxV0Ftb3VudEEIBQ0kdDA1NDUzNDU0NzUzAl8xBAplcVdBbW91bnRCCAUNJHQwNTQ1MzQ1NDc1MwJfMgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAzQgCBQVkZWJ0cwUEZGVidAkAzQgCBQtlcVdBbW91bnRzQQUKZXFXQW1vdW50QQkAzQgCBQtlcVdBbW91bnRzQgUKZXFXQW1vdW50QgkAZAIFBWluZGV4AAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIFBWRlYnRzCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAZAIFBWluZGV4AAEEDSR0MDU1MDA4NTUxMTkKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VzZXJQb3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQJd0Ftb3VudHNBCAUNJHQwNTUwMDg1NTExOQJfMQQJd0Ftb3VudHNCCAUNJHQwNTUwMDg1NTExOQJfMgQFZGVidHMIBQ0kdDA1NTAwODU1MTE5Al8zBAtlcVdBbW91bnRzQQgFDSR0MDU1MDA4NTUxMTkCXzQEC2VxV0Ftb3VudHNCCAUNJHQwNTUwMDg1NTExOQJfNQkAlAoCBQNuaWwJAJcKBQUJd0Ftb3VudHNBBQl3QW1vdW50c0IFBWRlYnRzBQtlcVdBbW91bnRzQQULZXFXQW1vdW50c0IBaQEJcmVwbGVuaXNoBARwb29sCGxldmVyYWdlCGJvcnJvd0lkDXN0YWtlVG9NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDmFsbG93ZWRCQXNzZXRzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUYa1Bvb2xBbGxvd2VkQm9ycm93QXNzZXRzAgADCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQBmAgBkBQhsZXZlcmFnZQYJAGYCBQhsZXZlcmFnZQCsAgkAAgECH0xldmVyYWdlIGNhbid0IGJlIDwxMDAgYW5kID4zMDADAwkBASEBCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FuQm9ycm93CQBmAgUIbGV2ZXJhZ2UAZAcJAAIBAh1Zb3UgY2FuJ3QgYm9ycm93IGluIHRoaXMgcG9vbAMDAwkAZgIFCGxldmVyYWdlAGQJAQIhPQIFDmFsbG93ZWRCQXNzZXRzAgAHCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQC1CQIFDmFsbG93ZWRCQXNzZXRzAgEsBQhib3Jyb3dJZAcJAAIBAhtZb3UgY2FuJ3QgYm9ycm93IHRoaXMgYXNzZXQDAwUNc3Rha2VUb01hcmtldAkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAUMa1Bvb2xQTUFya2V0BwcJAAIBAiZUaGlzIHBvb2wgY2FuJ3Qgc3Rha2UgdG8gcHV6emxlIG1hcmtldAQNJHQwNTYxMTI1NjIwMgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA1NjExMjU2MjAyAl8xBANCSWQIBQ0kdDA1NjExMjU2MjAyAl8yBARiYWxBCAUNJHQwNTYxMTI1NjIwMgJfMwQEYmFsQggFDSR0MDU2MTEyNTYyMDICXzQEB3NoYXJlSWQIBQ0kdDA1NjExMjU2MjAyAl81AwMJAQIhPQIFCGJvcnJvd0lkBQNBSWQJAQIhPQIFCGJvcnJvd0lkBQNCSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0BA0kdDA1NjI4MzU2MzQyCQEScGFyc2VSZXBsZW5pc2hQbXRzAwgFAWkIcGF5bWVudHMFA0FJZAUDQklkBARwbXRBCAUNJHQwNTYyODM1NjM0MgJfMQQEcG10QggFDSR0MDU2MjgzNTYzNDICXzIEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAluZXdQb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyAwkAZgIFCGxldmVyYWdlAGQEDGJvcnJvd0Ftb3VudAkBEGNhbGNCb3Jyb3dBbW91bnQIBQRwbXRBBQRwbXRCBQRiYWxBBQRiYWxCBQNBSWQFA0JJZAUIbGV2ZXJhZ2UFCGJvcnJvd0lkBAdyZXF1ZXN0CQC5CQIJAMwIAgUEdXNlcgkAzAgCBQRwb29sCQDMCAIJAKQDAQUEcG10QQkAzAgCBQNBSWQJAMwIAgkApAMBBQRwbXRCCQDMCAIFA0JJZAkAzAgCCQCkAwEFBGJhbEEJAMwIAgkApAMBBQRiYWxCCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgkApAMBBQxib3Jyb3dBbW91bnQJAMwIAgkApQMBBQ1zdGFrZVRvTWFya2V0BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDA1NzM3NzU3NDcxCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDA1NzM3NzU3NDcxBQ0kdDA1NzM3NzU3NDcxBAduZXdCYWxCCAUNJHQwNTczNzc1NzQ3MQJfMgQHbmV3QmFsQQgFDSR0MDU3Mzc3NTc0NzECXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNTc1NDE1NzY1NgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDU3NTQxNTc2NTYCXzEECHdBbW91bnRCCAUNJHQwNTc1NDE1NzY1NgJfMgQPZnV0dXJlQm9ycm93QXB5CQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACFmNhbGN1bGF0ZVRva2VuSW50ZXJlc3QJAMwIAgUIYm9ycm93SWQJAMwIAgcFA25pbAUDbmlsAwkAAAIFD2Z1dHVyZUJvcnJvd0FweQUPZnV0dXJlQm9ycm93QXB5CQCUCgIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgkAzAgCBQ9mdXR1cmVCb3Jyb3dBcHkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNTc4Mjg1Nzk1OAkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFDXN0YWtlVG9NYXJrZXQDCQAAAgUNJHQwNTc4Mjg1Nzk1OAUNJHQwNTc4Mjg1Nzk1OAQHYXhseUZlZQgFDSR0MDU3ODI4NTc5NTgCXzIECnVzZXJTdGFrZWQIBQ0kdDA1NzgyODU3OTU4Al8xBA0kdDA1Nzk2NDU4MDU4CQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDA1Nzk2NDU4MDU4BQ0kdDA1Nzk2NDU4MDU4BAduZXdCYWxCCAUNJHQwNTc5NjQ1ODA1OAJfMgQHbmV3QmFsQQgFDSR0MDU3OTY0NTgwNTgCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNTgxMjg1ODI0MwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDU4MTI4NTgyNDMCXzEECHdBbW91bnRCCAUNJHQwNTgxMjg1ODI0MwJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCQUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcFDXN0YWtlVG9NYXJrZXQJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCCQDMCAIAAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgUJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwIAAWkBEHdpdGhkcmF3T25lVG9rZW4DBHBvb2wFcG9zSWQHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50CQEOd2l0aGRyYXdUb1VzZXIFCQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAcFB3Rva2VuSWQBaQEUY3JlYXRlVXBkYXRlU3RvcExvc3MEBXBvc0lkBnBvb2xJZAdhc3NldElkBXByaWNlCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZwb29sSWQCAV8JAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQACAQIaVGhlcmUgYXJlIG5vIHVzZXIgcG9zaXRpb24DCQBnAgAABQVwcmljZQkAAgECHFByaWNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgUFcHJpY2UFEHRva2VuT3JhY2xlUHJpY2UJAAIBAitQcmljZSBtdXN0IGJlIGxlc3MgdGhhbiBjdXJyZW50IHRva2VuIHByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFBXByaWNlBQNuaWwBaQEOZGVsZXRlU3RvcExvc3MDBXBvc0lkBnBvb2xJZAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MJAAIBAghObyBlbnRyeQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFA25pbAFpAQRpbml0DQxtb25leUJveEFkZHINc2ZGYXJtaW5nQWRkcghsZW5kQWRkcg9wcmljZU9yYWNsZUFkZHIQa2VlcGVyRXhDb250cmFjdA53eFN3YXBDb250cmFjdAtzd29wQXNzZXRJZAl3eEFzc2V0SWQOb3BlcmF0b3JQdWJLZXkSZ3JvdXAxQWRtaW4xUHViS2V5Emdyb3VwMUFkbWluMlB1YktleRJncm91cDJBZG1pbjFQdWJLZXkSZ3JvdXAyQWRtaW4yUHViS2V5CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAoggBBQ9rT3BlcmF0b3JDYWxsUEsJAAIBAg5BbHJlYWR5IGluaXRlZAMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUMbW9uZXlCb3hBZGRyCQACAQIjbW9uZXlCb3hBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDXNmRmFybWluZ0FkZHIJAAIBAiRzZkZhcm1pbmdBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFCGxlbmRBZGRyCQACAQIfbGVuZEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUPcHJpY2VPcmFjbGVBZGRyCQACAQImcHJpY2VPcmFjbGVBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFEGtlZXBlckV4Q29udHJhY3QJAAIBAidrZWVwZXJFeENvbnRyYWN0IGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQULc3dvcEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQl3eEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQIhPQIJAMgBAQkA2QQBBQ5vcGVyYXRvclB1YktleQAgCQACAQIdb3BlcmF0b3JQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa01vbmV5Qm94BQxtb25leUJveEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa1NGRmFybWluZ0FkZHIFDXNmRmFybWluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa0xlbmRTZXJ2aWNlBQhsZW5kQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrUHJpY2VPcmFjbGUFD3ByaWNlT3JhY2xlQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQtrRXhDb250cmFjdAUQa2VlcGVyRXhDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rV3hTd2FwQ29udHJhY3QFDnd4U3dhcENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tTd29wSWQFC3N3b3BBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtXeElkBQl3eEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa09wZXJhdG9yQ2FsbFBLBQ5vcGVyYXRvclB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4xUEsFEmdyb3VwMUFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4yUEsFEmdyb3VwMUFkbWluMlB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4xUEsFEmdyb3VwMkFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4yUEsFEmdyb3VwMkFkbWluMlB1YktleQUDbmlsAWkBEGNyZWF0ZU5ld1JlcXVlc3QBBnBhcmFtcwkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpBAxuZXdSZXF1ZXN0SWQJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtSZXF1ZXN0SXRlcgAAAAEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQUMbmV3UmVxdWVzdElkBQprUmVxdWVzdElkBQZwYXJhbXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtSZXF1ZXN0SXRlcgUMbmV3UmVxdWVzdElkBQNuaWwFDG5ld1JlcXVlc3RJZAFpARFyZXBsZW5pc2hGcm9tTGFuZAEJcmVxdWVzdElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEDSR0MDYzNDY2NjM1ODUJAQxwYXJzZVJlcXVlc3QBBQlyZXF1ZXN0SWQEBHVzZXIIBQ0kdDA2MzQ2NjYzNTg1Al8xBARwb29sCAUNJHQwNjM0NjY2MzU4NQJfMgQEcG10QQgFDSR0MDYzNDY2NjM1ODUCXzMEA0FJZAgFDSR0MDYzNDY2NjM1ODUCXzQEBHBtdEIIBQ0kdDA2MzQ2NjYzNTg1Al81BANCSWQIBQ0kdDA2MzQ2NjYzNTg1Al82BARiYWxBCAUNJHQwNjM0NjY2MzU4NQJfNwQEYmFsQggFDSR0MDYzNDY2NjM1ODUCXzgEB3NoYXJlSWQIBQ0kdDA2MzQ2NjYzNTg1Al85BAdid0Fzc2V0CAUNJHQwNjM0NjY2MzU4NQNfMTAECGJ3QW1vdW50CAUNJHQwNjM0NjY2MzU4NQNfMTEEDXN0YWtlVG9NYXJrZXQIBQ0kdDA2MzQ2NjYzNTg1A18xMgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdid0Fzc2V0BgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGJ3QW1vdW50CQACAQINV3JvbmcgcGF5bWVudAQNJHQwNjM3NzU2Mzg3NQMJAAACBQNBSWQFB2J3QXNzZXQJAJQKAgkAZAIFBHBtdEEFCGJ3QW1vdW50BQRwbXRCCQCUCgIFBHBtdEEJAGQCBQRwbXRCBQhid0Ftb3VudAQHcG10QWxsQQgFDSR0MDYzNzc1NjM4NzUCXzEEB3BtdEFsbEIIBQ0kdDA2Mzc3NTYzODc1Al8yBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNjM5NTc2NDA4NwkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQhMT0FOX0ZFRQUHcG10QWxsQQUDQUlkBQdwbXRBbGxCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFDXN0YWtlVG9NYXJrZXQECnVzZXJTdGFrZWQIBQ0kdDA2Mzk1NzY0MDg3Al8xBAdheGx5RmVlCAUNJHQwNjM5NTc2NDA4NwJfMgQGcG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgQNYm9ycm93RW50cmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAUIYndBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRJrVXNlckJvcnJvd0Fzc2V0SWQFB2J3QXNzZXQFA25pbAQHZW50cmllcwkBEHJlcGxlbmlzaEVudHJpZXMJBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQZwb3NOdW0FB3NoYXJlSWQFBXBUeXBlBgUNc3Rha2VUb01hcmtldAQNJHQwNjQ0NjI2NDU3NwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDY0NDYyNjQ1NzcCXzEECHdBbW91bnRCCAUNJHQwNjQ0NjI2NDU3NwJfMgkAlAoCCQDNCAIJAM4IAgkAzggCBQdlbnRyaWVzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAUNYm9ycm93RW50cmllcwkBC0RlbGV0ZUVudHJ5AQkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFCnVzZXJTdGFrZWQBaQEJbGlxdWlkYXRlAwR1c2VyBXBvc0lkD2xpcXVpZGF0ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpCQEMbGlxdWlkYXRlUG9zBAgFAWkGY2FsbGVyBQR1c2VyBQVwb3NJZAUPbGlxdWlkYXRlQW1vdW50AWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBQUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYCAAkAlAoCCQDNCAIIBQNyZXMCXzEJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwgFA3JlcwJfMgFpAQxjYXBpdGFsaXplRXgFBHBvb2wFcm91dGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDY1OTkzNjYwNTkJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwNjU5OTM2NjA1OQJfMQQDQklkCAUNJHQwNjU5OTM2NjA1OQJfMgQEYmFsQQgFDSR0MDY1OTkzNjYwNTkCXzMEBGJhbEIIBQ0kdDA2NTk5MzY2MDU5Al80BAdzaGFyZUlkCAUNJHQwNjU5OTM2NjA1OQJfNQQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQMaXNNYXJrZXRQb29sCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAUMa1Bvb2xQTUFya2V0BwQNJHQwNjYxODg2NzAxNAMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAAEDSR0MDY2MjUwNjYzNDcJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQAAAwkAAAIFDSR0MDY2MjUwNjYzNDcFDSR0MDY2MjUwNjYzNDcEDGNsYWltZWRBc3NldAgFDSR0MDY2MjUwNjYzNDcCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA2NjI1MDY2MzQ3Al8xBAVyQXJncwkAtQkCBQVyb3V0ZQICX18ED2V4Y2hhbmdlZEFtb3VudAMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAADCQAAAgkAkQMCBQVyQXJncwAAAhBkaXJlY3RTd29wZmlDUE1NCQEQZGlyZWN0U3dvcGZpQ1BNTQIFBXJBcmdzBQl0b2tlblRvSWQDCQAAAgkAkQMCBQVyQXJncwAAAg1yb3V0aW5nU3dvcGZpCQETZGlyZWN0Um91dGluZ1N3b3BmaQIFBXJBcmdzBQl0b2tlblRvSWQJAAIBAgtXcm9uZyByb3V0ZQAAAwkAAAIFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50BAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwFA25pbAQNJHQwNjY4NDQ2Njk1NAkBCmNhcGl0YWxpemUJBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAtjYXBFbnRlcmlzZQgFDSR0MDY2ODQ0NjY5NTQCXzEEBnN0YWtlZAgFDSR0MDY2ODQ0NjY5NTQCXzIJAJQKAgkAzggCBQtjYXBFbnRlcmlzZQULY2hhbmdlRW50cnkFBnN0YWtlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQNuaWwAAAQLY2FwRW50ZXJpc2UIBQ0kdDA2NjE4ODY3MDE0Al8xBAZzdGFrZWQIBQ0kdDA2NjE4ODY3MDE0Al8yBA0kdDA2NzAxNzY3MTM0AwUMaXNNYXJrZXRQb29sCQEWY2FwaXRhbGl6ZVB1enpsZU1hcmtldAMFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAAABBBtYXJrZXRDYXBFbnRlcmlzCAUNJHQwNjcwMTc2NzEzNAJfMQQMc3Rha2VkTWFya2V0CAUNJHQwNjcwMTc2NzEzNAJfMgkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgkAZAIFEHRvdGFsU2hhcmVBbW91bnQFBnN0YWtlZAUMc3Rha2VkTWFya2V0BQNuaWwFC2NhcEVudGVyaXNlBRBtYXJrZXRDYXBFbnRlcmlzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAUDbmlsAWkBDmNhcGl0YWxpemVOb0V4AwRwb29sBWNsYWltEWFtb3VudEZyb21CYWxhbmNlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDA2NzU2OTY3NjM1CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDY3NTY5Njc2MzUCXzEEA0JJZAgFDSR0MDY3NTY5Njc2MzUCXzIEBGJhbEEIBQ0kdDA2NzU2OTY3NjM1Al8zBARiYWxCCAUNJHQwNjc1Njk2NzYzNQJfNAQHc2hhcmVJZAgFDSR0MDY3NTY5Njc2MzUCXzUEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEDSR0MDY3Njg3Njc3ODUJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQAABRFhbW91bnRGcm9tQmFsYW5jZQMJAAACBQ0kdDA2NzY4NzY3Nzg1BQ0kdDA2NzY4NzY3Nzg1BAxjbGFpbWVkQXNzZXQIBQ0kdDA2NzY4NzY3Nzg1Al8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNjc2ODc2Nzc4NQJfMQQNJHQwNjc3ODg2NzkxNAkBCmNhcGl0YWxpemUJBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAUNY2xhaW1lZEFtb3VudAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQEC2NhcEVudGVyaXNlCAUNJHQwNjc3ODg2NzkxNAJfMQQGc3Rha2VkCAUNJHQwNjc3ODg2NzkxNAJfMgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFEHRvdGFsU2hhcmVBbW91bnQFBnN0YWtlZAUDbmlsBQtjYXBFbnRlcmlzZQkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtpbml0TmV3UG9vbAwEdHlwZQhwb29sVHlwZQhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JY2FuQm9ycm93CmNhblBNYXJrZXQTYWxsb3dlZEJvcnJvd0Fzc2V0cwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMDCQECIT0CBQR0eXBlBQdTRl9QT09MCQECIT0CBQR0eXBlBQdXWF9QT09MBwkAAgECCldyb25nIHR5cGUDAwkBAiE9AgUIcG9vbFR5cGUFBENQTU0JAQIhPQIFCHBvb2xUeXBlBQRGTEFUBwkAAgECD1dyb25nIHBvb2wgdHlwZQQNJHQwNjg1Njg2ODY2MgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFCHBvb2xBZGRyBQR0eXBlBANhSWQIBQ0kdDA2ODU2ODY4NjYyAl8xBANiSWQIBQ0kdDA2ODU2ODY4NjYyAl8yBARhQmFsCAUNJHQwNjg1Njg2ODY2MgJfMwQEYkJhbAgFDSR0MDY4NTY4Njg2NjICXzQEB3NoYXJlSWQIBQ0kdDA2ODU2ODY4NjYyAl81AwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAEGGFsbG93ZWRCb3Jyb3dBc3NldHNFbnRyeQMJAQIhPQIFE2FsbG93ZWRCb3Jyb3dBc3NldHMCAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHBvb2xBZGRyBRhrUG9vbEFsbG93ZWRCb3Jyb3dBc3NldHMFE2FsbG93ZWRCb3Jyb3dBc3NldHMFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrUG9vbEludGVyZXN0TG9hbgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVrUG9vbAUIcG9vbEFkZHIFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhwb29sQWRkcgUJa1Bvb2xUeXBlBQhwb29sVHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wFCHBvb2xBZGRyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ5rUG9vbENhbkJvcnJvdwUJY2FuQm9ycm93CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQxrUG9vbFBNQXJrZXQFCmNhblBNYXJrZXQFA25pbAUYYWxsb3dlZEJvcnJvd0Fzc2V0c0VudHJ5AWkBDnVwZGF0ZVBvb2xGZWVzBwhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyCQACAQkArAICAhpDYW4ndCBmaW5kIHBvb2wgd2l0aCBhZGRyIAUIcG9vbEFkZHIDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4FA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQITZEFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhVkQXBwIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHBQNuaWwBaQEQYWN0aXZhdGVGb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh1kQXBwIGFscmVhZHkgYWN0aXZlIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBgUDbmlsAWkBEHNodXRkb3duRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh9kQXBwIGFscmVhZHkgc2h1dGRvd24gZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMHBQNuaWwBaQEKYWN0aXZhdGVTRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIVU1dPUEZJIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIXU1dPUEZJIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEKYWN0aXZhdGVXWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIRV1ggYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25XWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhNXWCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBDGFjdGl2YXRlUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhNQb29sIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgUDbmlsAWkBDHNodXRkb3duUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECFVBvb2wgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQcFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDmdyb3VwMUFkbWluMVBLAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUOZ3JvdXAxQWRtaW4yUEsAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQ5ncm91cDFBZG1pbjNQSwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgUTbXVsdGlTaWduZWRCeUFkbWluc2XG3TE=", "height": 4119506, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DhqQtkKkCNLR2zhKL1w7xxKA6VsT3gYVxv4ZrSCA9uL9 Next: GG5kWHmbzSmjbtHqaL3deiyWumcHTuhsg8r38kuqja1R Diff:
OldNewDifferences
688688 then if ((amoutGet == amountTokenToGet))
689689 then $Tuple2(assetIn, amountTokenToGet)
690690 else {
691- let $t02137921830 = {
691+ let $t02137921838 = {
692692 let aPM = if ((amountTokenToGet > amoutGet))
693693 then fraction(amountTokenToGet, 110, 100)
694694 else fraction(amountTokenToGet, 90, 100)
699699 else throw(($getType(@) + " couldn't be cast to Int"))
700700 }
701701 if ((amountGetMax == amountGetMax))
702- then if ((amoutGet > amountGetMax))
702+ then if ((amountTokenToGet > amountGetMax))
703703 then $Tuple2(aPM, fraction(aPM, 110, 100))
704704 else $Tuple2(amountTokenToGet, aPM)
705705 else throw("Strict value is not equal to itself.")
706706 }
707- let amountToPayMin = $t02137921830._1
708- let amountToPayMax = $t02137921830._2
707+ let amountToPayMin = $t02137921838._1
708+ let amountToPayMax = $t02137921838._2
709709 func hdm (a,index) = {
710- let $t02187721898 = a
711- let pay = $t02187721898._1
712- let payMax = $t02187721898._2
710+ let $t02188521906 = a
711+ let pay = $t02188521906._1
712+ let payMax = $t02188521906._2
713713 let payNext = ((pay + payMax) / 2)
714714 let amountGetNext = {
715715 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
748748
749749
750750 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
751- let $t02249422533 = getWXSwapFees(pool)
752- let pFee = $t02249422533._1
753- let prFee = $t02249422533._2
751+ let $t02250222541 = getWXSwapFees(pool)
752+ let pFee = $t02250222541._1
753+ let prFee = $t02250222541._2
754754 let poolType = valueOrElse(getString(this, (pool + kPoolType)), CPMM)
755755 let feeScale = toBigInt(100000000)
756756 if ((poolType == FLAT))
757757 then calcFlatToPay(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
758758 else {
759- let $t02276623074 = if ((assetTokenToGet == assetIdA))
759+ let $t02277423082 = if ((assetTokenToGet == assetIdA))
760760 then {
761761 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
762762 $Tuple2(amountToPay, assetIdB)
765765 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
766766 $Tuple2(amountToPay, assetIdA)
767767 }
768- let amountToPay = $t02276623074._1
769- let assetToPay = $t02276623074._2
768+ let amountToPay = $t02277423082._1
769+ let assetToPay = $t02277423082._2
770770 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
771771 $Tuple2(assetToPay, amountToPayWithFee)
772772 }
779779 then true
780780 else (poolFB != ""))
781781 then {
782- let $t02351523727 = if ((poolFB == ""))
782+ let $t02352323735 = if ((poolFB == ""))
783783 then $Tuple3(balA, balB, pool)
784784 else {
785- let $t02362123694 = getSFPoolBalances(addressFromStringValue(poolFB))
786- let sfBalA = $t02362123694._1
787- let sfBalB = $t02362123694._2
785+ let $t02362923702 = getSFPoolBalances(addressFromStringValue(poolFB))
786+ let sfBalA = $t02362923702._1
787+ let sfBalB = $t02362923702._2
788788 $Tuple3(sfBalA, sfBalB, poolFB)
789789 }
790- let pBalA = $t02351523727._1
791- let pBalB = $t02351523727._2
792- let exPool = $t02351523727._3
793- let $t02373223858 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
794- let assetToPay = $t02373223858._1
795- let amountToPay = $t02373223858._2
790+ let pBalA = $t02352323735._1
791+ let pBalB = $t02352323735._2
792+ let exPool = $t02352323735._3
793+ let $t02374023866 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
794+ let assetToPay = $t02374023866._1
795+ let amountToPay = $t02374023866._2
796796 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
797797 }
798798 else if ((pType == WX_POOL))
799799 then {
800- let $t02406024182 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
801- let assetToPay = $t02406024182._1
802- let amountToPay = $t02406024182._2
800+ let $t02406824190 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
801+ let assetToPay = $t02406824190._1
802+ let amountToPay = $t02406824190._2
803803 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
804804 }
805805 else unknownPoolType()
837837
838838
839839 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
840- let $t02531125782 = if ((pType == SF_POOL))
840+ let $t02531925790 = if ((pType == SF_POOL))
841841 then {
842842 let inv = {
843843 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
872872 else throw("Strict value is not equal to itself.")
873873 }
874874 else unknownPoolType()
875- let amountA = $t02531125782._1
876- let amountB = $t02531125782._2
875+ let amountA = $t02531925790._1
876+ let amountB = $t02531925790._2
877877 $Tuple2(amountA, amountB)
878878 }
879879
897897 }
898898 else if ((pType == WX_POOL))
899899 then {
900- let $t02622226301 = getWXPoolData(addressFromStringValue(pool))
901- let aId = $t02622226301._1
902- let bId = $t02622226301._2
903- let aBal = $t02622226301._3
904- let bBal = $t02622226301._4
905- let lpId = $t02622226301._5
900+ let $t02623026309 = getWXPoolData(addressFromStringValue(pool))
901+ let aId = $t02623026309._1
902+ let bId = $t02623026309._2
903+ let aBal = $t02623026309._3
904+ let bBal = $t02623026309._4
905+ let lpId = $t02623026309._5
906906 let balBefore = accountBalance(WXID)
907907 if ((balBefore == balBefore))
908908 then {
928928 if ((lpBalanceBefore == lpBalanceBefore))
929929 then {
930930 let poolAddr = addressFromStringValue(pool)
931- let $t02710627534 = if (if ((pmtA > 0))
931+ let $t02711427542 = if (if ((pmtA > 0))
932932 then (pmtB > 0)
933933 else false)
934934 then {
935- let $t02717227294 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
936- let pmtInA = $t02717227294._1
937- let pmtInB = $t02717227294._2
938- let change = $t02717227294._3
939- let changeId = $t02717227294._4
935+ let $t02718027302 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
936+ let pmtInA = $t02718027302._1
937+ let pmtInB = $t02718027302._2
938+ let change = $t02718027302._3
939+ let changeId = $t02718027302._4
940940 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
941941 if ((inv == inv))
942942 then $Tuple2(change, changeId)
947947 else if ((pmtB > 0))
948948 then $Tuple2(pmtB, bId)
949949 else throw("pmts must be > 0")
950- let change = $t02710627534._1
951- let changeId = $t02710627534._2
950+ let change = $t02711427542._1
951+ let changeId = $t02711427542._2
952952 let inv = if ((change > 0))
953953 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
954954 else nil
982982 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
983983 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
984984 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
985- let $t02899529820 = if (withLoan)
985+ let $t02900329828 = if (withLoan)
986986 then if (stakeToMarket)
987987 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
988988 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
989989 else if (stakeToMarket)
990990 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
991991 else $Tuple2(poolInterestNoLoan, nil)
992- let curPoolInterest = $t02899529820._1
993- let adEntry = $t02899529820._2
992+ let curPoolInterest = $t02900329828._1
993+ let adEntry = $t02900329828._2
994994 ([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)
995995 }
996996
10891089 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10901090 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10911091 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
1092- let $t03289832998 = if ((tokenId == AId))
1092+ let $t03290633006 = if ((tokenId == AId))
10931093 then $Tuple2((tokenAmount - axlyFee), 0)
10941094 else $Tuple2(0, (tokenAmount - axlyFee))
1095- let pmtA = $t03289832998._1
1096- let pmtB = $t03289832998._2
1097- let $t03300133112 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1098- let stakedAmount = $t03300133112._1
1099- let nf = $t03300133112._2
1095+ let pmtA = $t03290633006._1
1096+ let pmtB = $t03290633006._2
1097+ let $t03300933120 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1098+ let stakedAmount = $t03300933120._1
1099+ let nf = $t03300933120._2
11001100 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
11011101 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
11021102 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
12181218 let userAddr = Address(fromBase58String(user))
12191219 let poolAddr = Address(fromBase58String(pool))
12201220 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1221- let $t03916639238 = getPoolData(poolAddr, pType)
1222- let idAStr = $t03916639238._1
1223- let idBStr = $t03916639238._2
1224- let balA = $t03916639238._3
1225- let balB = $t03916639238._4
1226- let shareId = $t03916639238._5
1227- let $t03924139308 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1228- let idA = $t03924139308._1
1229- let idB = $t03924139308._2
1221+ let $t03917439246 = getPoolData(poolAddr, pType)
1222+ let idAStr = $t03917439246._1
1223+ let idBStr = $t03917439246._2
1224+ let balA = $t03917439246._3
1225+ let balB = $t03917439246._4
1226+ let shareId = $t03917439246._5
1227+ let $t03924939316 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1228+ let idA = $t03924939316._1
1229+ let idB = $t03924939316._2
12301230 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
12311231 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12321232 let cBalABefore = accountBalance(idA)
12601260 let cBalBAfter = accountBalance(idB)
12611261 if ((cBalBAfter == cBalBAfter))
12621262 then {
1263- let $t04031640405 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1264- let tokensAmountA = $t04031640405._1
1265- let tokensAmountB = $t04031640405._2
1266- let $t04040841653 = if (isBorrowed)
1263+ let $t04032440413 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1264+ let tokensAmountA = $t04032440413._1
1265+ let tokensAmountB = $t04032440413._2
1266+ let $t04041641661 = if (isBorrowed)
12671267 then {
12681268 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12691269 let debt = {
13121312 else throw("Strict value is not equal to itself.")
13131313 }
13141314 else $Tuple2(tokensAmountA, tokensAmountB)
1315- let toUserA = $t04040841653._1
1316- let toUserB = $t04040841653._2
1315+ let toUserA = $t04041641661._1
1316+ let toUserB = $t04041641661._2
13171317 let poolTotalLoanEntries = if (isBorrowed)
13181318 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
13191319 else nil
13221322 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
13231323 else nil))
13241324 else nil
1325- let $t04206642461 = if (if ((withdrawToken == idAStr))
1325+ let $t04207442469 = if (if ((withdrawToken == idAStr))
13261326 then (toUserB > 0)
13271327 else false)
13281328 then {
13411341 else throw("Strict value is not equal to itself.")
13421342 }
13431343 else $Tuple2(toUserA, toUserB)
1344- let toUserACalc = $t04206642461._1
1345- let toUserBCalc = $t04206642461._2
1344+ let toUserACalc = $t04207442469._1
1345+ let toUserBCalc = $t04207442469._2
13461346 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))
13471347 $Tuple2(entries, [toUserACalc, toUserBCalc])
13481348 }
13711371 let userAddr = Address(fromBase58String(user))
13721372 let poolAddr = Address(fromBase58String(pool))
13731373 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1374- let $t04438644458 = getPoolData(poolAddr, pType)
1375- let idAStr = $t04438644458._1
1376- let idBStr = $t04438644458._2
1377- let balA = $t04438644458._3
1378- let balB = $t04438644458._4
1379- let shareId = $t04438644458._5
1380- let $t04446144528 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1381- let idA = $t04446144528._1
1382- let idB = $t04446144528._2
1374+ let $t04439444466 = getPoolData(poolAddr, pType)
1375+ let idAStr = $t04439444466._1
1376+ let idBStr = $t04439444466._2
1377+ let balA = $t04439444466._3
1378+ let balB = $t04439444466._4
1379+ let shareId = $t04439444466._5
1380+ let $t04446944536 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1381+ let idA = $t04446944536._1
1382+ let idB = $t04446944536._2
13831383 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
13841384 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13851385 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
14131413 let cBalBAfter = accountBalance(idB)
14141414 if ((cBalBAfter == cBalBAfter))
14151415 then {
1416- let $t04571245801 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1417- let tokensAmountA = $t04571245801._1
1418- let tokensAmountB = $t04571245801._2
1416+ let $t04572045809 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1417+ let tokensAmountA = $t04572045809._1
1418+ let tokensAmountB = $t04572045809._2
14191419 let amountToGetEx = if (if ((borrowAsset == idAStr))
14201420 then (lAmount > tokensAmountA)
14211421 else false)
14361436 let cBalBAfterRepay = accountBalance(idB)
14371437 if ((cBalBAfterRepay == cBalBAfterRepay))
14381438 then {
1439- let $t04630746534 = if ((borrowAsset == idAStr))
1439+ let $t04631546542 = if ((borrowAsset == idAStr))
14401440 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
14411441 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
1442- let toUserA = $t04630746534._1
1443- let toUserB = $t04630746534._2
1444- let $t04653746614 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1445- let balAAfter = $t04653746614._1
1446- let balBAfter = $t04653746614._2
1447- let $t04661746748 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1448- let userStaked = $t04661746748._1
1449- let axlyFee = $t04661746748._2
1442+ let toUserA = $t04631546542._1
1443+ let toUserB = $t04631546542._2
1444+ let $t04654546622 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1445+ let balAAfter = $t04654546622._1
1446+ let balBAfter = $t04654546622._2
1447+ let $t04662546756 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1448+ let userStaked = $t04662546756._1
1449+ let axlyFee = $t04662546756._2
14501450 let userLpLiqudated = (userCanWithdraw - userStaked)
1451- let $t04680747152 = if (fromMarket)
1451+ let $t04681547160 = if (fromMarket)
14521452 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
14531453 else $Tuple2(poolInterestLoan, nil)
1454- let curPoolInterest = $t04680747152._1
1455- let poolTotalMarketEntries = $t04680747152._2
1454+ let curPoolInterest = $t04681547160._1
1455+ let poolTotalMarketEntries = $t04681547160._2
14561456 $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)
14571457 }
14581458 else throw("Strict value is not equal to itself.")
15131513 then priceOracleB
15141514 else fraction(fraction(balA, decPrB, balB), priceOracleA, decPrA)
15151515 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1516- let $t04929649393 = if ((borrowId == aId))
1516+ let $t04930449401 = if ((borrowId == aId))
15171517 then $Tuple2(dPriceA, decPrA)
15181518 else $Tuple2(dPriceB, decPrB)
1519- let borrowPrice = $t04929649393._1
1520- let borrowDecPr = $t04929649393._2
1519+ let borrowPrice = $t04930449401._1
1520+ let borrowDecPr = $t04930449401._2
15211521 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
15221522 }
15231523 }
15471547
15481548
15491549 func claimAndCheckAmnt (pool,pType,claim,amountToExchange,amountFromBalance) = {
1550- let $t05041451265 = if (claim)
1550+ let $t05042251273 = if (claim)
15511551 then {
15521552 let claimed = claimFarmed(pType, pool)
15531553 if ((amountToExchange > 0))
15761576 else unknownPoolType()
15771577 $Tuple2((amountToExchange + amountFromBalance), claimedAsset)
15781578 }
1579- if (($t05041451265 == $t05041451265))
1579+ if (($t05042251273 == $t05042251273))
15801580 then {
1581- let asset = $t05041451265._2
1582- let amount = $t05041451265._1
1581+ let asset = $t05042251273._2
1582+ let amount = $t05042251273._1
15831583 let bal = accountBalance(asset)
15841584 if ((bal == bal))
15851585 then if ((amount > bal))
15951595 func getPoolInfoREADONLY (pool) = {
15961596 let poolAddr = addressFromStringValue(pool)
15971597 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1598- let $t05161751707 = getPoolData(Address(fromBase58String(pool)), pType)
1599- let AId = $t05161751707._1
1600- let BId = $t05161751707._2
1601- let balA = $t05161751707._3
1602- let balB = $t05161751707._4
1603- let shareId = $t05161751707._5
1598+ let $t05162551715 = getPoolData(Address(fromBase58String(pool)), pType)
1599+ let AId = $t05162551715._1
1600+ let BId = $t05162551715._2
1601+ let balA = $t05162551715._3
1602+ let balB = $t05162551715._4
1603+ let shareId = $t05162551715._5
16041604 let shareSupply = getShareSupply(poolAddr, pType, shareId)
16051605 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
16061606 }
16291629 @Callable(i)
16301630 func getUserPositionREADONLY (user,pools,posNum) = {
16311631 func userPos (a,pool) = {
1632- let $t05270552775 = a
1633- let wAmountsA = $t05270552775._1
1634- let wAmountsB = $t05270552775._2
1635- let debts = $t05270552775._3
1636- let eqWAmountsA = $t05270552775._4
1637- let eqWAmountsB = $t05270552775._5
1638- let index = $t05270552775._6
1632+ let $t05271352783 = a
1633+ let wAmountsA = $t05271352783._1
1634+ let wAmountsB = $t05271352783._2
1635+ let debts = $t05271352783._3
1636+ let eqWAmountsA = $t05271352783._4
1637+ let eqWAmountsB = $t05271352783._5
1638+ let index = $t05271352783._6
16391639 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
16401640 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
16411641 else {
16421642 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1643- let $t05305453144 = getPoolData(Address(fromBase58String(pool)), pType)
1644- let AId = $t05305453144._1
1645- let BId = $t05305453144._2
1646- let balA = $t05305453144._3
1647- let balB = $t05305453144._4
1648- let shareId = $t05305453144._5
1643+ let $t05306253152 = getPoolData(Address(fromBase58String(pool)), pType)
1644+ let AId = $t05306253152._1
1645+ let BId = $t05306253152._2
1646+ let balA = $t05306253152._3
1647+ let balB = $t05306253152._4
1648+ let shareId = $t05306253152._5
16491649 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
16501650 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
16511651 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1652- let $t05349453614 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1653- let wAmountA = $t05349453614._1
1654- let wAmountB = $t05349453614._2
1652+ let $t05350253622 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1653+ let wAmountA = $t05350253622._1
1654+ let wAmountB = $t05350253622._2
16551655 if ((borrowAmount > 0))
16561656 then {
16571657 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
16851685 }
16861686 else unknownPoolType()
16871687 else 0
1688- let $t05452654745 = if ((borrowAsset == AId))
1688+ let $t05453454753 = if ((borrowAsset == AId))
16891689 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
16901690 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1691- let eqWAmountA = $t05452654745._1
1692- let eqWAmountB = $t05452654745._2
1691+ let eqWAmountA = $t05453454753._1
1692+ let eqWAmountB = $t05453454753._2
16931693 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
16941694 }
16951695 else throw("Strict value is not equal to itself.")
16981698 }
16991699 }
17001700
1701- let $t05500055111 = {
1701+ let $t05500855119 = {
17021702 let $l = pools
17031703 let $s = size($l)
17041704 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
17121712
17131713 $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)
17141714 }
1715- let wAmountsA = $t05500055111._1
1716- let wAmountsB = $t05500055111._2
1717- let debts = $t05500055111._3
1718- let eqWAmountsA = $t05500055111._4
1719- let eqWAmountsB = $t05500055111._5
1715+ let wAmountsA = $t05500855119._1
1716+ let wAmountsB = $t05500855119._2
1717+ let debts = $t05500855119._3
1718+ let eqWAmountsA = $t05500855119._4
1719+ let eqWAmountsB = $t05500855119._5
17201720 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
17211721 }
17221722
17471747 else false)
17481748 then throw("This pool can't stake to puzzle market")
17491749 else {
1750- let $t05610456194 = getPoolData(Address(fromBase58String(pool)), pType)
1751- let AId = $t05610456194._1
1752- let BId = $t05610456194._2
1753- let balA = $t05610456194._3
1754- let balB = $t05610456194._4
1755- let shareId = $t05610456194._5
1750+ let $t05611256202 = getPoolData(Address(fromBase58String(pool)), pType)
1751+ let AId = $t05611256202._1
1752+ let BId = $t05611256202._2
1753+ let balA = $t05611256202._3
1754+ let balB = $t05611256202._4
1755+ let shareId = $t05611256202._5
17561756 if (if ((borrowId != AId))
17571757 then (borrowId != BId)
17581758 else false)
17591759 then throw("Wrong borrow asset")
17601760 else {
1761- let $t05627556334 = parseReplenishPmts(i.payments, AId, BId)
1762- let pmtA = $t05627556334._1
1763- let pmtB = $t05627556334._2
1761+ let $t05628356342 = parseReplenishPmts(i.payments, AId, BId)
1762+ let pmtA = $t05628356342._1
1763+ let pmtB = $t05628356342._2
17641764 let user = toString(i.caller)
17651765 let newPosNum = getNewUserPositionNumber(user)
17661766 if ((leverage > 100))
17801780 if ((inv == inv))
17811781 then {
17821782 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1783- let $t05736957463 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1784- if (($t05736957463 == $t05736957463))
1783+ let $t05737757471 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1784+ if (($t05737757471 == $t05737757471))
17851785 then {
1786- let newBalB = $t05736957463._2
1787- let newBalA = $t05736957463._1
1786+ let newBalB = $t05737757471._2
1787+ let newBalA = $t05737757471._1
17881788 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1789- let $t05753357648 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1790- let wAmountA = $t05753357648._1
1791- let wAmountB = $t05753357648._2
1789+ let $t05754157656 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1790+ let wAmountA = $t05754157656._1
1791+ let wAmountB = $t05754157656._2
17921792 let futureBorrowApy = invoke(getLendSrvAddr(), "calculateTokenInterest", [borrowId, false], nil)
17931793 if ((futureBorrowApy == futureBorrowApy))
17941794 then $Tuple2(nil, [prImpact, wAmountA, wAmountB, futureBorrowApy])
18011801 else throw("Strict value is not equal to itself.")
18021802 }
18031803 else {
1804- let $t05782057950 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1805- if (($t05782057950 == $t05782057950))
1804+ let $t05782857958 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1805+ if (($t05782857958 == $t05782857958))
18061806 then {
1807- let axlyFee = $t05782057950._2
1808- let userStaked = $t05782057950._1
1809- let $t05795658050 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1810- if (($t05795658050 == $t05795658050))
1807+ let axlyFee = $t05782857958._2
1808+ let userStaked = $t05782857958._1
1809+ let $t05796458058 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1810+ if (($t05796458058 == $t05796458058))
18111811 then {
1812- let newBalB = $t05795658050._2
1813- let newBalA = $t05795658050._1
1812+ let newBalB = $t05796458058._2
1813+ let newBalA = $t05796458058._1
18141814 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1815- let $t05812058235 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1816- let wAmountA = $t05812058235._1
1817- let wAmountB = $t05812058235._2
1815+ let $t05812858243 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1816+ let wAmountA = $t05812858243._1
1817+ let wAmountB = $t05812858243._2
18181818 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB, 0])
18191819 }
18201820 else throw("Strict value is not equal to itself.")
19171917
19181918 @Callable(i)
19191919 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1920- let $t06345863577 = parseRequest(requestId)
1921- let user = $t06345863577._1
1922- let pool = $t06345863577._2
1923- let pmtA = $t06345863577._3
1924- let AId = $t06345863577._4
1925- let pmtB = $t06345863577._5
1926- let BId = $t06345863577._6
1927- let balA = $t06345863577._7
1928- let balB = $t06345863577._8
1929- let shareId = $t06345863577._9
1930- let bwAsset = $t06345863577._10
1931- let bwAmount = $t06345863577._11
1932- let stakeToMarket = $t06345863577._12
1920+ let $t06346663585 = parseRequest(requestId)
1921+ let user = $t06346663585._1
1922+ let pool = $t06346663585._2
1923+ let pmtA = $t06346663585._3
1924+ let AId = $t06346663585._4
1925+ let pmtB = $t06346663585._5
1926+ let BId = $t06346663585._6
1927+ let balA = $t06346663585._7
1928+ let balB = $t06346663585._8
1929+ let shareId = $t06346663585._9
1930+ let bwAsset = $t06346663585._10
1931+ let bwAmount = $t06346663585._11
1932+ let stakeToMarket = $t06346663585._12
19331933 if ((size(i.payments) != 1))
19341934 then throw("Wrong payment size")
19351935 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
19371937 else (i.payments[0].amount != bwAmount))
19381938 then throw("Wrong payment")
19391939 else {
1940- let $t06376763867 = if ((AId == bwAsset))
1940+ let $t06377563875 = if ((AId == bwAsset))
19411941 then $Tuple2((pmtA + bwAmount), pmtB)
19421942 else $Tuple2(pmtA, (pmtB + bwAmount))
1943- let pmtAllA = $t06376763867._1
1944- let pmtAllB = $t06376763867._2
1943+ let pmtAllA = $t06377563875._1
1944+ let pmtAllB = $t06377563875._2
19451945 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1946- let $t06394964079 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1947- let userStaked = $t06394964079._1
1948- let axlyFee = $t06394964079._2
1946+ let $t06395764087 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1947+ let userStaked = $t06395764087._1
1948+ let axlyFee = $t06395764087._2
19491949 let posNum = getNewUserPositionNumber(user)
19501950 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
19511951 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1952- let $t06445464569 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1953- let wAmountA = $t06445464569._1
1954- let wAmountB = $t06445464569._2
1952+ let $t06446264577 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1953+ let wAmountA = $t06446264577._1
1954+ let wAmountB = $t06446264577._2
19551955 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
19561956 }
19571957 }))
19821982 let pType = getStringValue(this, (kPool + pool))
19831983 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
19841984 let poolAddr = Address(fromBase58String(pool))
1985- let $t06598566051 = getPoolData(poolAddr, pType)
1986- let AId = $t06598566051._1
1987- let BId = $t06598566051._2
1988- let balA = $t06598566051._3
1989- let balB = $t06598566051._4
1990- let shareId = $t06598566051._5
1985+ let $t06599366059 = getPoolData(poolAddr, pType)
1986+ let AId = $t06599366059._1
1987+ let BId = $t06599366059._2
1988+ let balA = $t06599366059._3
1989+ let balB = $t06599366059._4
1990+ let shareId = $t06599366059._5
19911991 let totalShareAmount = getPoolTotalShare(pool)
19921992 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1993- let $t06618067006 = if ((amountToExchange > 0))
1993+ let $t06618867014 = if ((amountToExchange > 0))
19941994 then {
1995- let $t06624266339 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1996- if (($t06624266339 == $t06624266339))
1995+ let $t06625066347 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1996+ if (($t06625066347 == $t06625066347))
19971997 then {
1998- let claimedAsset = $t06624266339._2
1999- let claimedAmount = $t06624266339._1
1998+ let claimedAsset = $t06625066347._2
1999+ let claimedAmount = $t06625066347._1
20002000 let rArgs = split(route, "__")
20012001 let exchangedAmount = if ((amountToExchange > 0))
20022002 then if ((rArgs[0] == "directSwopfiCPMM"))
20112011 let changeEntry = if ((newChange >= 0))
20122012 then [IntegerEntry((pool + kPoolCapChange), newChange)]
20132013 else nil
2014- let $t06683666946 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2015- let capEnterise = $t06683666946._1
2016- let staked = $t06683666946._2
2014+ let $t06684466954 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2015+ let capEnterise = $t06684466954._1
2016+ let staked = $t06684466954._2
20172017 $Tuple2((capEnterise ++ changeEntry), staked)
20182018 }
20192019 else throw("Strict value is not equal to itself.")
20212021 else throw("Strict value is not equal to itself.")
20222022 }
20232023 else $Tuple2(nil, 0)
2024- let capEnterise = $t06618067006._1
2025- let staked = $t06618067006._2
2026- let $t06700967126 = if (isMarketPool)
2024+ let capEnterise = $t06618867014._1
2025+ let staked = $t06618867014._2
2026+ let $t06701767134 = if (isMarketPool)
20272027 then capitalizePuzzleMarket(pool, pType, shareId)
20282028 else $Tuple2(nil, 0)
2029- let marketCapEnteris = $t06700967126._1
2030- let stakedMarket = $t06700967126._2
2029+ let marketCapEnteris = $t06701767134._1
2030+ let stakedMarket = $t06701767134._2
20312031 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
20322032 }))
20332033
20372037 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
20382038 let pType = getStringValue(this, (kPool + pool))
20392039 let poolAddr = Address(fromBase58String(pool))
2040- let $t06756167627 = getPoolData(poolAddr, pType)
2041- let AId = $t06756167627._1
2042- let BId = $t06756167627._2
2043- let balA = $t06756167627._3
2044- let balB = $t06756167627._4
2045- let shareId = $t06756167627._5
2040+ let $t06756967635 = getPoolData(poolAddr, pType)
2041+ let AId = $t06756967635._1
2042+ let BId = $t06756967635._2
2043+ let balA = $t06756967635._3
2044+ let balB = $t06756967635._4
2045+ let shareId = $t06756967635._5
20462046 let totalShareAmount = getPoolTotalShare(pool)
2047- let $t06767967777 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2048- if (($t06767967777 == $t06767967777))
2047+ let $t06768767785 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2048+ if (($t06768767785 == $t06768767785))
20492049 then {
2050- let claimedAsset = $t06767967777._2
2051- let claimedAmount = $t06767967777._1
2052- let $t06778067906 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2053- let capEnterise = $t06778067906._1
2054- let staked = $t06778067906._2
2050+ let claimedAsset = $t06768767785._2
2051+ let claimedAmount = $t06768767785._1
2052+ let $t06778867914 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2053+ let capEnterise = $t06778867914._1
2054+ let staked = $t06778867914._2
20552055 (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
20562056 }
20572057 else throw("Strict value is not equal to itself.")
20692069 else false)
20702070 then throw("Wrong pool type")
20712071 else {
2072- let $t06856068654 = getPoolData(Address(fromBase58String(poolAddr)), type)
2073- let aId = $t06856068654._1
2074- let bId = $t06856068654._2
2075- let aBal = $t06856068654._3
2076- let bBal = $t06856068654._4
2077- let shareId = $t06856068654._5
2072+ let $t06856868662 = getPoolData(Address(fromBase58String(poolAddr)), type)
2073+ let aId = $t06856868662._1
2074+ let bId = $t06856868662._2
2075+ let aBal = $t06856868662._3
2076+ let bBal = $t06856868662._4
2077+ let shareId = $t06856868662._5
20782078 if ((0 > inFeeNoLoan))
20792079 then throw("inFeeNoLoan must be greater than 0")
20802080 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 kPoolAllowedBorrowAssets = "_poolAllowedBorrowAssets"
8181
8282 let kPoolCanBorrow = "_poolCanBorrow"
8383
8484 let kPoolPMArket = "_poolPuzzleMarket"
8585
8686 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
8787
8888 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
8989
9090 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
9191
9292 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
9393
9494 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
9595
9696 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
9797
9898 let kRequestId = "_request_id"
9999
100100 let kRequestIter = "requests_iter"
101101
102102 let kPool = "pool_"
103103
104104 let kPoolType = "_poolType"
105105
106106 let kSharePool = "_poolShareId"
107107
108108 let kPoolCapChange = "_poolCapChange"
109109
110110 let kTokenLastPrice = "last_price"
111111
112112 let kPriceInOracle = "_twap5B"
113113
114114 let kActive = "active"
115115
116116 let kActiveUsers = "activeUsers"
117117
118118 let kActiveSFWX = "_active"
119119
120120 let kPoolActive = "_activePool"
121121
122122 let kUserStopLoss = "_stopLoss"
123123
124124 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
125125
126126 let kPoolProxyAddr = "_poolProxyAddress"
127127
128128 let kMoneyBox = "axly_money_box"
129129
130130 let kSFFarmingAddr = "swopfi_farming_addr"
131131
132132 let kLendService = "lend_service_addr"
133133
134134 let kOperatorCallPK = "admin_call_pub_key"
135135
136136 let kPriceOracle = "price_oracle"
137137
138138 let kExContract = "exchange_contract"
139139
140140 let kWxSwapContract = "wx_swap_contract"
141141
142142 let kWxRest = "wx_rest_addr"
143143
144144 let kSwopId = "swop_id"
145145
146146 let kWxId = "wx_id"
147147
148148 let kPMarketAddr = "puzzle_market_address"
149149
150150 let kPMarketRestAddr = "puzzle_market_rest_address"
151151
152152 let kGroup1Admin1PK = "group1_admin1_pub_key"
153153
154154 let kGroup1Admin2PK = "group1_admin2_pub_key"
155155
156156 let kGroup1Admin3PK = "group1_admin3_pub_key"
157157
158158 let kGroup2Admin1PK = "group2_admin1_pub_key"
159159
160160 let kGroup2Admin2PK = "group2_admin2_pub_key"
161161
162162 let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
163163
164164 let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
165165
166166 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
167167
168168 let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
169169
170170 let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
171171
172172 let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
173173
174174 let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
175175
176176 let pMarketAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketAddr), "No puzzle market address"))
177177
178178 let pMarketRestAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketRestAddr), "No puzzle market rest address"))
179179
180180 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
181181
182182 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
183183
184184 let group1Admin3PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin3PK), "Can't get kGroup1Admin3PK"))
185185
186186 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
187187
188188 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
189189
190190 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
191191
192192 func unknownPoolType () = throw("Wrong pool type")
193193
194194
195195 func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
196196
197197
198198 func isOperatorCall (i) = if (if ((i.callerPublicKey == operatorPK))
199199 then true
200200 else (i.caller == moneyBox))
201201 then unit
202202 else throw("Only operator can call this function")
203203
204204
205205 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
206206 then true
207207 else (i.callerPublicKey == group1Admin2PK))
208208 then unit
209209 else throw("Only admin group1 can call this function")
210210
211211
212212 func isSelfCall (i) = if ((i.caller == this))
213213 then unit
214214 else throw("Only contract itself can call this function")
215215
216216
217217 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
218218 then unit
219219 else throw("Only land contract can call this function")
220220
221221
222222 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
223223 then unit
224224 else throw("DApp is inactive at this moment")
225225
226226
227227 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
228228 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
229229 else false)
230230 then unit
231231 else throw("DApp is inactive for users at this moment")
232232
233233
234234 func isPoolActive (pool,type) = {
235235 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
236236 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
237237 if (if (WXSFActive)
238238 then poolActive
239239 else false)
240240 then true
241241 else false
242242 }
243243
244244
245245 func accountBalance (assetId) = match assetId {
246246 case id: ByteVector =>
247247 assetBalance(this, id)
248248 case waves: Unit =>
249249 wavesBalance(this).available
250250 case _ =>
251251 throw("Match error")
252252 }
253253
254254
255255 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"))
256256
257257
258258 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
259259 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
260260 if ($isInstanceOf(@, "Int"))
261261 then @
262262 else throw(($getType(@) + " couldn't be cast to Int"))
263263 }, {
264264 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
265265 if ($isInstanceOf(@, "Int"))
266266 then @
267267 else throw(($getType(@) + " couldn't be cast to Int"))
268268 })
269269
270270
271271 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
272272 then getSFPoolBalances(poolAddr)
273273 else if ((type == WX_POOL))
274274 then getWXPoolBalances(poolAddr, aId, bId)
275275 else unknownPoolType()
276276
277277
278278 func getSFPoolData (poolAddr) = {
279279 let $t097399788 = getSFPoolBalances(poolAddr)
280280 if (($t097399788 == $t097399788))
281281 then {
282282 let balB = $t097399788._2
283283 let balA = $t097399788._1
284284 $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"))
285285 }
286286 else throw("Strict value is not equal to itself.")
287287 }
288288
289289
290290 func getWXPoolData (poolAddr) = {
291291 let cfg = {
292292 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
293293 if ($isInstanceOf(@, "List[Any]"))
294294 then @
295295 else throw(($getType(@) + " couldn't be cast to List[Any]"))
296296 }
297297 if ((cfg == cfg))
298298 then {
299299 let aId = valueOrErrorMessage({
300300 let @ = cfg[4]
301301 if ($isInstanceOf(@, "String"))
302302 then @
303303 else unit
304304 }, "Can't get pool A asset id")
305305 let bId = valueOrErrorMessage({
306306 let @ = cfg[5]
307307 if ($isInstanceOf(@, "String"))
308308 then @
309309 else unit
310310 }, "Can't get pool B asset id")
311311 let shareId = valueOrErrorMessage({
312312 let @ = cfg[3]
313313 if ($isInstanceOf(@, "String"))
314314 then @
315315 else unit
316316 }, "Can't get pool LP asset id")
317317 let $t01048510544 = getWXPoolBalances(poolAddr, aId, bId)
318318 if (($t01048510544 == $t01048510544))
319319 then {
320320 let balB = $t01048510544._2
321321 let balA = $t01048510544._1
322322 $Tuple5(aId, bId, balA, balB, shareId)
323323 }
324324 else throw("Strict value is not equal to itself.")
325325 }
326326 else throw("Strict value is not equal to itself.")
327327 }
328328
329329
330330 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
331331 then getSFPoolData(poolAddr)
332332 else if ((type == WX_POOL))
333333 then getWXPoolData(poolAddr)
334334 else unknownPoolType()
335335
336336
337337 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
338338 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
339339 else if ((type == WX_POOL))
340340 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
341341 else unknownPoolType()
342342
343343
344344 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
345345
346346
347347 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
348348
349349
350350 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
351351
352352
353353 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
354354 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
355355 else if ((feeType == CAP_FEE_NO_LOAN))
356356 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
357357 else if ((feeType == LOAN_FEE))
358358 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
359359 else if ((feeType == NO_LOAN_FEE))
360360 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
361361 else if ((feeType == NO_FEE))
362362 then 0
363363 else throw("Wrong fee type")
364364
365365
366366 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(CONF, kSFFarmingAddr), "Can't get swopfi farming addr")))
367367
368368
369369 func getWXFarmingAddr (poolAddr) = {
370370 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
371371 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
372372 Address(fromBase58String(factroyCfg[1]))
373373 }
374374
375375
376376 func assetIdToStr (assetId) = match assetId {
377377 case id: ByteVector =>
378378 toBase58String(id)
379379 case waves: Unit =>
380380 "WAVES"
381381 case _ =>
382382 throw("Not Asset id")
383383 }
384384
385385
386386 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
387387 then unit
388388 else fromBase58String(assetId)
389389
390390
391391 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
392392 then 8
393393 else match assetInfo(fromBase58String(assetId)) {
394394 case asset: Asset =>
395395 asset.decimals
396396 case _ =>
397397 throw("Can't find asset")
398398 }
399399
400400
401401 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
402402
403403
404404 func getAssetsPrice (assetIds) = {
405405 func getPrices (a,assetId) = {
406406 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
407407 (a :+ assetPrice)
408408 }
409409
410410 let $l = assetIds
411411 let $s = size($l)
412412 let $acc0 = nil
413413 func $f0_1 ($a,$i) = if (($i >= $s))
414414 then $a
415415 else getPrices($a, $l[$i])
416416
417417 func $f0_2 ($a,$i) = if (($i >= $s))
418418 then $a
419419 else throw("List size exceeds 50")
420420
421421 $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)
422422 }
423423
424424
425425 func getSharePrice (shareId) = {
426426 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
427427 let poolAddr = Address(fromBase58String(pool))
428428 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
429429 let $t01353313598 = getPoolData(poolAddr, pType)
430430 let aId = $t01353313598._1
431431 let bId = $t01353313598._2
432432 let aBalance = $t01353313598._3
433433 let bBalance = $t01353313598._4
434434 let prices = getAssetsPrice([aId, bId])
435435 let dPriceA = prices[0]
436436 let dPriceB = prices[1]
437437 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
438438 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
439439 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
440440 let shareSupply = getShareSupply(poolAddr, pType, shareId)
441441 let sum = if (if ((dPriceA > 0))
442442 then (dPriceB > 0)
443443 else false)
444444 then (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
445445 else if ((dPriceA > 0))
446446 then (fraction(aBalance, dPriceA, APrecision) * 2)
447447 else if ((dPriceB > 0))
448448 then (fraction(bBalance, dPriceB, BPrecision) * 2)
449449 else -1
450450 if ((0 > sum))
451451 then -1
452452 else fraction(sum, sharePrecision, shareSupply)
453453 }
454454
455455
456456 func getSharePrices (shareIds) = {
457457 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
458458
459459 let $l = shareIds
460460 let $s = size($l)
461461 let $acc0 = nil
462462 func $f0_1 ($a,$i) = if (($i >= $s))
463463 then $a
464464 else getPrices($a, $l[$i])
465465
466466 func $f0_2 ($a,$i) = if (($i >= $s))
467467 then $a
468468 else throw("List size exceeds 20")
469469
470470 $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)
471471 }
472472
473473
474474 func getCursEntries (aId,bId,shareId,wAmounts) = {
475475 let assetsPrices = getAssetsPrice([aId, bId])
476476 let sharePrice = getSharePrice(shareId)
477477 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
478478 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
479479 }
480480
481481
482482 func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
483483 then {
484484 let repl = {
485485 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
486486 if ($isInstanceOf(@, "List[Any]"))
487487 then @
488488 else throw(($getType(@) + " couldn't be cast to List[Any]"))
489489 }
490490 if ((repl == repl))
491491 then $Tuple5({
492492 let @ = repl[3]
493493 if ($isInstanceOf(@, "Int"))
494494 then @
495495 else throw(($getType(@) + " couldn't be cast to Int"))
496496 }, {
497497 let @ = repl[4]
498498 if ($isInstanceOf(@, "Int"))
499499 then @
500500 else throw(($getType(@) + " couldn't be cast to Int"))
501501 }, {
502502 let @ = repl[1]
503503 if ($isInstanceOf(@, "Int"))
504504 then @
505505 else throw(($getType(@) + " couldn't be cast to Int"))
506506 }, assetIdToStr(repl[2]), {
507507 let @ = repl[0]
508508 if ($isInstanceOf(@, "Int"))
509509 then @
510510 else throw(($getType(@) + " couldn't be cast to Int"))
511511 })
512512 else throw("Strict value is not equal to itself.")
513513 }
514514 else if ((pType == WX_POOL))
515515 then {
516516 let $t01535315619 = $Tuple2(split({
517517 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
518518 if ($isInstanceOf(@, "String"))
519519 then @
520520 else throw(($getType(@) + " couldn't be cast to String"))
521521 }, "__"), split({
522522 let @ = invoke(wxRest, "poolEvaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
523523 if ($isInstanceOf(@, "String"))
524524 then @
525525 else throw(($getType(@) + " couldn't be cast to String"))
526526 }, "__"))
527527 if (($t01535315619 == $t01535315619))
528528 then {
529529 let evalPutInB = $t01535315619._2
530530 let evalPutInA = $t01535315619._1
531531 let lpInA = parseIntValue(evalPutInA[1])
532532 let lpInB = parseIntValue(evalPutInB[1])
533533 if ((lpInB > lpInA))
534534 then {
535535 let pmt = parseIntValue(evalPutInA[8])
536536 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
537537 }
538538 else {
539539 let pmt = parseIntValue(evalPutInB[7])
540540 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
541541 }
542542 }
543543 else throw("Strict value is not equal to itself.")
544544 }
545545 else unknownPoolType()
546546
547547
548548 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId,lpId) = {
549549 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
550550 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
551551 if ((pType == SF_POOL))
552552 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
553553 else if ((pType == WX_POOL))
554554 then if ((proxyAddr == ""))
555555 then invoke(poolAddr, "put", [1000000, false], payments)
556556 else invoke(addressFromStringValue(proxyAddr), "wxReplenishTwoTokens", [toString(poolAddr), lpId, 1000000, false], payments)
557557 else unknownPoolType()
558558 }
559559
560560
561561 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId,lpId) = {
562562 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
563563 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
564564 if ((pType == SF_POOL))
565565 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
566566 else if ((pType == WX_POOL))
567567 then {
568568 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
569569 then "putOneTknV2"
570570 else "putOneTkn"
571571 if ((proxyAddr == ""))
572572 then invoke(poolAddr, fc, [0, false], payments)
573573 else invoke(addressFromStringValue(proxyAddr), "wxReplenishOneToken", [toString(poolAddr), lpId, fc, 0, false], payments)
574574 }
575575 else unknownPoolType()
576576 }
577577
578578
579579 func stakeLP (pool,pType,shareId,amount,stakeToMarket) = {
580580 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
581581 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
582582 if (stakeToMarket)
583583 then invoke(pMarketAddr, "supply", nil, payments)
584584 else if ((pType == SF_POOL))
585585 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
586586 else if ((pType == WX_POOL))
587587 then {
588588 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
589589 if ((proxyAddr == ""))
590590 then invoke(farmAddr, "stake", nil, payments)
591591 else invoke(addressFromStringValue(proxyAddr), "wxStakeLp", [toString(farmAddr)], payments)
592592 }
593593 else unknownPoolType()
594594 }
595595
596596
597597 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
598598 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
599599 let $t01835619038 = if (fromMarket)
600600 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
601601 else if ((pType == SF_POOL))
602602 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
603603 else if ((pType == WX_POOL))
604604 then {
605605 let farmAddr = getWXFarmingAddr(Address(fromBase58String(pool)))
606606 if ((proxyAddr == ""))
607607 then $Tuple3(farmAddr, "unstake", [shareId, amount])
608608 else $Tuple3(addressFromStringValue(proxyAddr), "wxUnstakeLp", [toString(farmAddr), shareId, amount])
609609 }
610610 else unknownPoolType()
611611 let farmAddr = $t01835619038._1
612612 let fName = $t01835619038._2
613613 let params = $t01835619038._3
614614 let inv = invoke(farmAddr, fName, params, nil)
615615 if ((inv == inv))
616616 then amount
617617 else throw("Strict value is not equal to itself.")
618618 }
619619
620620
621621 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
622622 let poolAddr = Address(fromBase58String(pool))
623623 let feeScale6 = 1000000
624624 let fee = getIntegerValue(poolAddr, kSFPoolFee)
625625 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
626626 let $t01946019766 = if ((assetTokenToGet == assetIdA))
627627 then {
628628 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
629629 $Tuple2(amountToPay, assetIdB)
630630 }
631631 else {
632632 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
633633 $Tuple2(amountToPay, assetIdA)
634634 }
635635 let amountToPay = $t01946019766._1
636636 let assetToPay = $t01946019766._2
637637 $Tuple2(assetToPay, amountToPay)
638638 }
639639
640640
641641 func getWXSwapFees (pool) = {
642642 let poolAddr = addressFromStringValue(pool)
643643 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
644644 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
645645 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
646646 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
647647 case fees: (Int, Int) =>
648648 $Tuple2(fees._1, fees._2)
649649 case _ =>
650650 $Tuple2(poolFeeDefault, protocolFeeDefault)
651651 }
652652 }
653653
654654
655655 func getWXPoolReverse (poolAddr,assetIn,assetOut) = {
656656 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
657657 let lpNonReverse = {
658658 let @ = invoke(fContract, "getLpAssetFromPoolAssetsREADONLY", [assetIn, assetOut], nil)
659659 if ($isInstanceOf(@, "String"))
660660 then @
661661 else unit
662662 }
663663 let lpReverse = {
664664 let @ = invoke(fContract, "getLpAssetFromPoolAssetsREADONLY", [assetOut, assetIn], nil)
665665 if ($isInstanceOf(@, "String"))
666666 then @
667667 else unit
668668 }
669669 if ((lpNonReverse != unit))
670670 then false
671671 else if ((lpReverse != unit))
672672 then true
673673 else throw("Pool is not exist")
674674 }
675675
676676
677677 func calcFlatToPay (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
678678 let assetIn = if ((assetTokenToGet == assetIdA))
679679 then assetIdB
680680 else assetIdA
681681 let amoutGet = {
682682 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [amountTokenToGet, assetIn, assetTokenToGet], nil)
683683 if ($isInstanceOf(@, "Int"))
684684 then @
685685 else throw(($getType(@) + " couldn't be cast to Int"))
686686 }
687687 if ((amoutGet == amoutGet))
688688 then if ((amoutGet == amountTokenToGet))
689689 then $Tuple2(assetIn, amountTokenToGet)
690690 else {
691- let $t02137921830 = {
691+ let $t02137921838 = {
692692 let aPM = if ((amountTokenToGet > amoutGet))
693693 then fraction(amountTokenToGet, 110, 100)
694694 else fraction(amountTokenToGet, 90, 100)
695695 let amountGetMax = {
696696 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [aPM, assetIn, assetTokenToGet], nil)
697697 if ($isInstanceOf(@, "Int"))
698698 then @
699699 else throw(($getType(@) + " couldn't be cast to Int"))
700700 }
701701 if ((amountGetMax == amountGetMax))
702- then if ((amoutGet > amountGetMax))
702+ then if ((amountTokenToGet > amountGetMax))
703703 then $Tuple2(aPM, fraction(aPM, 110, 100))
704704 else $Tuple2(amountTokenToGet, aPM)
705705 else throw("Strict value is not equal to itself.")
706706 }
707- let amountToPayMin = $t02137921830._1
708- let amountToPayMax = $t02137921830._2
707+ let amountToPayMin = $t02137921838._1
708+ let amountToPayMax = $t02137921838._2
709709 func hdm (a,index) = {
710- let $t02187721898 = a
711- let pay = $t02187721898._1
712- let payMax = $t02187721898._2
710+ let $t02188521906 = a
711+ let pay = $t02188521906._1
712+ let payMax = $t02188521906._2
713713 let payNext = ((pay + payMax) / 2)
714714 let amountGetNext = {
715715 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
716716 if ($isInstanceOf(@, "Int"))
717717 then @
718718 else throw(($getType(@) + " couldn't be cast to Int"))
719719 }
720720 if ((amountGetNext == amountGetNext))
721721 then if ((amountTokenToGet > amountGetNext))
722722 then $Tuple2(payNext, payMax)
723723 else $Tuple2(pay, payNext)
724724 else throw("Strict value is not equal to itself.")
725725 }
726726
727727 let resAmntToPay = {
728728 let $l = [1, 2]
729729 let $s = size($l)
730730 let $acc0 = $Tuple2(amountToPayMin, amountToPayMax)
731731 func $f0_1 ($a,$i) = if (($i >= $s))
732732 then $a
733733 else hdm($a, $l[$i])
734734
735735 func $f0_2 ($a,$i) = if (($i >= $s))
736736 then $a
737737 else throw("List size exceeds 2")
738738
739739 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
740740 }
741741 let amountToPay = if ((amountTokenToGet > amoutGet))
742742 then resAmntToPay._2
743743 else resAmntToPay._1
744744 $Tuple2(assetIn, amountToPay)
745745 }
746746 else throw("Strict value is not equal to itself.")
747747 }
748748
749749
750750 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
751- let $t02249422533 = getWXSwapFees(pool)
752- let pFee = $t02249422533._1
753- let prFee = $t02249422533._2
751+ let $t02250222541 = getWXSwapFees(pool)
752+ let pFee = $t02250222541._1
753+ let prFee = $t02250222541._2
754754 let poolType = valueOrElse(getString(this, (pool + kPoolType)), CPMM)
755755 let feeScale = toBigInt(100000000)
756756 if ((poolType == FLAT))
757757 then calcFlatToPay(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
758758 else {
759- let $t02276623074 = if ((assetTokenToGet == assetIdA))
759+ let $t02277423082 = if ((assetTokenToGet == assetIdA))
760760 then {
761761 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
762762 $Tuple2(amountToPay, assetIdB)
763763 }
764764 else {
765765 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
766766 $Tuple2(amountToPay, assetIdA)
767767 }
768- let amountToPay = $t02276623074._1
769- let assetToPay = $t02276623074._2
768+ let amountToPay = $t02277423082._1
769+ let assetToPay = $t02277423082._2
770770 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
771771 $Tuple2(assetToPay, amountToPayWithFee)
772772 }
773773 }
774774
775775
776776 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
777777 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
778778 if (if ((pType == SF_POOL))
779779 then true
780780 else (poolFB != ""))
781781 then {
782- let $t02351523727 = if ((poolFB == ""))
782+ let $t02352323735 = if ((poolFB == ""))
783783 then $Tuple3(balA, balB, pool)
784784 else {
785- let $t02362123694 = getSFPoolBalances(addressFromStringValue(poolFB))
786- let sfBalA = $t02362123694._1
787- let sfBalB = $t02362123694._2
785+ let $t02362923702 = getSFPoolBalances(addressFromStringValue(poolFB))
786+ let sfBalA = $t02362923702._1
787+ let sfBalB = $t02362923702._2
788788 $Tuple3(sfBalA, sfBalB, poolFB)
789789 }
790- let pBalA = $t02351523727._1
791- let pBalB = $t02351523727._2
792- let exPool = $t02351523727._3
793- let $t02373223858 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
794- let assetToPay = $t02373223858._1
795- let amountToPay = $t02373223858._2
790+ let pBalA = $t02352323735._1
791+ let pBalB = $t02352323735._2
792+ let exPool = $t02352323735._3
793+ let $t02374023866 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
794+ let assetToPay = $t02374023866._1
795+ let amountToPay = $t02374023866._2
796796 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
797797 }
798798 else if ((pType == WX_POOL))
799799 then {
800- let $t02406024182 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
801- let assetToPay = $t02406024182._1
802- let amountToPay = $t02406024182._2
800+ let $t02406824190 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
801+ let assetToPay = $t02406824190._1
802+ let amountToPay = $t02406824190._2
803803 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
804804 }
805805 else unknownPoolType()
806806 }
807807
808808
809809 func exchangeDirectlyNoLim (pType,pool,amountTokenEx,assetTokenToEx,assetTokenToGet) = {
810810 let balBefore = accountBalance(assetIdFromStr(assetTokenToGet))
811811 if ((balBefore == balBefore))
812812 then {
813813 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
814814 let inv = if (if ((pType == SF_POOL))
815815 then true
816816 else (poolFB != ""))
817817 then {
818818 let exPool = if ((poolFB == ""))
819819 then pool
820820 else poolFB
821821 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
822822 }
823823 else if ((pType == WX_POOL))
824824 then invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
825825 else unknownPoolType()
826826 if ((inv == inv))
827827 then {
828828 let balAfter = accountBalance(assetIdFromStr(assetTokenToGet))
829829 if ((balAfter == balAfter))
830830 then (balAfter - balBefore)
831831 else throw("Strict value is not equal to itself.")
832832 }
833833 else throw("Strict value is not equal to itself.")
834834 }
835835 else throw("Strict value is not equal to itself.")
836836 }
837837
838838
839839 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
840- let $t02531125782 = if ((pType == SF_POOL))
840+ let $t02531925790 = if ((pType == SF_POOL))
841841 then {
842842 let inv = {
843843 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
844844 if ($isInstanceOf(@, "List[Any]"))
845845 then @
846846 else throw(($getType(@) + " couldn't be cast to List[Any]"))
847847 }
848848 if ((inv == inv))
849849 then $Tuple2({
850850 let @ = inv[0]
851851 if ($isInstanceOf(@, "Int"))
852852 then @
853853 else throw(($getType(@) + " couldn't be cast to Int"))
854854 }, {
855855 let @ = inv[1]
856856 if ($isInstanceOf(@, "Int"))
857857 then @
858858 else throw(($getType(@) + " couldn't be cast to Int"))
859859 })
860860 else throw("Strict value is not equal to itself.")
861861 }
862862 else if ((pType == WX_POOL))
863863 then {
864864 let inv = split({
865865 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
866866 if ($isInstanceOf(@, "String"))
867867 then @
868868 else throw(($getType(@) + " couldn't be cast to String"))
869869 }, "__")
870870 if ((inv == inv))
871871 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
872872 else throw("Strict value is not equal to itself.")
873873 }
874874 else unknownPoolType()
875- let amountA = $t02531125782._1
876- let amountB = $t02531125782._2
875+ let amountA = $t02531925790._1
876+ let amountB = $t02531925790._2
877877 $Tuple2(amountA, amountB)
878878 }
879879
880880
881881 func claimFarmed (pType,pool) = {
882882 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
883883 if ((pType == SF_POOL))
884884 then {
885885 let balBefore = accountBalance(SWOPID)
886886 if ((balBefore == balBefore))
887887 then {
888888 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
889889 if ((inv == inv))
890890 then {
891891 let balAfter = accountBalance(SWOPID)
892892 $Tuple2((balAfter - balBefore), SWOPID)
893893 }
894894 else throw("Strict value is not equal to itself.")
895895 }
896896 else throw("Strict value is not equal to itself.")
897897 }
898898 else if ((pType == WX_POOL))
899899 then {
900- let $t02622226301 = getWXPoolData(addressFromStringValue(pool))
901- let aId = $t02622226301._1
902- let bId = $t02622226301._2
903- let aBal = $t02622226301._3
904- let bBal = $t02622226301._4
905- let lpId = $t02622226301._5
900+ let $t02623026309 = getWXPoolData(addressFromStringValue(pool))
901+ let aId = $t02623026309._1
902+ let bId = $t02623026309._2
903+ let aBal = $t02623026309._3
904+ let bBal = $t02623026309._4
905+ let lpId = $t02623026309._5
906906 let balBefore = accountBalance(WXID)
907907 if ((balBefore == balBefore))
908908 then {
909909 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
910910 let inv = if ((proxyAddr == ""))
911911 then invoke(farmAddr, "claimWx", [lpId], nil)
912912 else invoke(addressFromStringValue(proxyAddr), "wxClaimFarmed", [toString(farmAddr), lpId], nil)
913913 if ((inv == inv))
914914 then {
915915 let balAfter = accountBalance(WXID)
916916 $Tuple2((balAfter - balBefore), WXID)
917917 }
918918 else throw("Strict value is not equal to itself.")
919919 }
920920 else throw("Strict value is not equal to itself.")
921921 }
922922 else unknownPoolType()
923923 }
924924
925925
926926 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId,stakeMarket) = {
927927 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
928928 if ((lpBalanceBefore == lpBalanceBefore))
929929 then {
930930 let poolAddr = addressFromStringValue(pool)
931- let $t02710627534 = if (if ((pmtA > 0))
931+ let $t02711427542 = if (if ((pmtA > 0))
932932 then (pmtB > 0)
933933 else false)
934934 then {
935- let $t02717227294 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
936- let pmtInA = $t02717227294._1
937- let pmtInB = $t02717227294._2
938- let change = $t02717227294._3
939- let changeId = $t02717227294._4
935+ let $t02718027302 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
936+ let pmtInA = $t02718027302._1
937+ let pmtInB = $t02718027302._2
938+ let change = $t02718027302._3
939+ let changeId = $t02718027302._4
940940 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
941941 if ((inv == inv))
942942 then $Tuple2(change, changeId)
943943 else throw("Strict value is not equal to itself.")
944944 }
945945 else if ((pmtA > 0))
946946 then $Tuple2(pmtA, aId)
947947 else if ((pmtB > 0))
948948 then $Tuple2(pmtB, bId)
949949 else throw("pmts must be > 0")
950- let change = $t02710627534._1
951- let changeId = $t02710627534._2
950+ let change = $t02711427542._1
951+ let changeId = $t02711427542._2
952952 let inv = if ((change > 0))
953953 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
954954 else nil
955955 if ((inv == inv))
956956 then {
957957 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
958958 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
959959 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
960960 let userShareForStake = (totalStaked - axlyFeeAmount)
961961 if ((0 >= userShareForStake))
962962 then throw("amount of staked sharetokens must be > 0")
963963 else {
964964 let invLP = stakeLP(pool, pType, LPId, userShareForStake, stakeMarket)
965965 if ((invLP == invLP))
966966 then $Tuple2(userShareForStake, axlyFeeAmount)
967967 else throw("Strict value is not equal to itself.")
968968 }
969969 }
970970 else throw("Strict value is not equal to itself.")
971971 }
972972 else throw("Strict value is not equal to itself.")
973973 }
974974
975975
976976 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan,stakeToMarket) = {
977977 let totalAmount = getPoolTotalShare(pool)
978978 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
979979 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
980980 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
981981 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
982982 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
983983 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
984984 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
985- let $t02899529820 = if (withLoan)
985+ let $t02900329828 = if (withLoan)
986986 then if (stakeToMarket)
987987 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
988988 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
989989 else if (stakeToMarket)
990990 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
991991 else $Tuple2(poolInterestNoLoan, nil)
992- let curPoolInterest = $t02899529820._1
993- let adEntry = $t02899529820._2
992+ let curPoolInterest = $t02900329828._1
993+ let adEntry = $t02900329828._2
994994 ([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)
995995 }
996996
997997
998998 func listToInt (a,item) = (a :+ parseIntValue(item))
999999
10001000
10011001 func directSwopfiCPMM (rArgs,tokenTo) = {
10021002 let dApp = addressFromStringValue(rArgs[1])
10031003 let pmtP = split(rArgs[2], "|")
10041004 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
10051005 if ((tokenBalanceBefore == tokenBalanceBefore))
10061006 then {
10071007 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
10081008 let minToRecive = rArgs[3]
10091009 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
10101010 if ((inv == inv))
10111011 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
10121012 else throw("Strict value is not equal to itself.")
10131013 }
10141014 else throw("Strict value is not equal to itself.")
10151015 }
10161016
10171017
10181018 func directRoutingSwopfi (rArgs,tokenTo) = {
10191019 let dApp = addressFromStringValue(rArgs[1])
10201020 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
10211021 if ((tokenBalanceBefore == tokenBalanceBefore))
10221022 then {
10231023 let pmt = {
10241024 let pmtP = split(rArgs[2], "|")
10251025 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
10261026 }
10271027 let args = {
10281028 let eArgs = split(rArgs[3], "|")
10291029 let exchangers = split(eArgs[0], ",")
10301030 let exchangersType = split(eArgs[1], ",")
10311031 let args1 = {
10321032 let $l = split(eArgs[2], ",")
10331033 let $s = size($l)
10341034 let $acc0 = nil
10351035 func $f0_1 ($a,$i) = if (($i >= $s))
10361036 then $a
10371037 else listToInt($a, $l[$i])
10381038
10391039 func $f0_2 ($a,$i) = if (($i >= $s))
10401040 then $a
10411041 else throw("List size exceeds 3")
10421042
10431043 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
10441044 }
10451045 let args2 = {
10461046 let $l = split(eArgs[3], ",")
10471047 let $s = size($l)
10481048 let $acc0 = nil
10491049 func $f1_1 ($a,$i) = if (($i >= $s))
10501050 then $a
10511051 else listToInt($a, $l[$i])
10521052
10531053 func $f1_2 ($a,$i) = if (($i >= $s))
10541054 then $a
10551055 else throw("List size exceeds 3")
10561056
10571057 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
10581058 }
10591059 let routingAssetsKeys = split(eArgs[4], ",")
10601060 let minToRecive = parseIntValue(eArgs[5])
10611061 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
10621062 }
10631063 let inv = invoke(dApp, "routingTrade", args, pmt)
10641064 if ((inv == inv))
10651065 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
10661066 else throw("Strict value is not equal to itself.")
10671067 }
10681068 else throw("Strict value is not equal to itself.")
10691069 }
10701070
10711071
10721072 func capitalize (pool,pType,tokenId,tokenAmount,AId,BId,balA,balB,shareId) = if (if ((tokenId != AId))
10731073 then (tokenId != BId)
10741074 else false)
10751075 then throw("Wrong asset")
10761076 else {
10771077 let totalShareAmount = getPoolTotalShare(pool)
10781078 if ((totalShareAmount == 0))
10791079 then $Tuple2([ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))], 0)
10801080 else {
10811081 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
10821082 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
10831083 if ((0 > ((totalShareAmount - totalMarketAmount) - totalShareAmountWithLoan)))
10841084 then throw("Error with share amount totalShareAmount < totalShareAmountWithLoan")
10851085 else {
10861086 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, (totalShareAmount - totalMarketAmount))
10871087 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
10881088 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
10891089 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10901090 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10911091 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
1092- let $t03289832998 = if ((tokenId == AId))
1092+ let $t03290633006 = if ((tokenId == AId))
10931093 then $Tuple2((tokenAmount - axlyFee), 0)
10941094 else $Tuple2(0, (tokenAmount - axlyFee))
1095- let pmtA = $t03289832998._1
1096- let pmtB = $t03289832998._2
1097- let $t03300133112 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1098- let stakedAmount = $t03300133112._1
1099- let nf = $t03300133112._2
1095+ let pmtA = $t03290633006._1
1096+ let pmtB = $t03290633006._2
1097+ let $t03300933120 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1098+ let stakedAmount = $t03300933120._1
1099+ let nf = $t03300933120._2
11001100 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
11011101 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
11021102 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
11031103 let stakedNoLoan = (stakedAmount - stakedLoan)
11041104 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
11051105 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
11061106 else 0
11071107 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
11081108 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
11091109 else 0
11101110 $Tuple2([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))], stakedAmount)
11111111 }
11121112 }
11131113 }
11141114
11151115
11161116 func capitalizePuzzleMarket (pool,pType,shareId) = {
11171117 let totalShareAmount = getPoolTotalShare(pool)
11181118 let marketBalance = assetBalance(pMarketAddr, fromBase58String(shareId))
11191119 if ((marketBalance == marketBalance))
11201120 then {
11211121 let marketAvailable = {
11221122 let @ = invoke(pMarketRestAddr, "assetSupplyByAddressREADONLY", [toString(pMarketAddr), shareId, toString(this)], nil)
11231123 if ($isInstanceOf(@, "Int"))
11241124 then @
11251125 else throw(($getType(@) + " couldn't be cast to Int"))
11261126 }
11271127 if ((marketAvailable == marketAvailable))
11281128 then {
11291129 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
11301130 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
11311131 if (if ((totalMarketAmount == 0))
11321132 then (marketAvailable > 0)
11331133 else false)
11341134 then {
11351135 let unstakedAmount = unstakeLP(pool, pType, shareId, marketAvailable, true)
11361136 if ((unstakedAmount == unstakedAmount))
11371137 then if ((marketBalance > unstakedAmount))
11381138 then $Tuple2([ScriptTransfer(moneyBox, unstakedAmount, fromBase58String(shareId))], 0)
11391139 else $Tuple2(nil, 0)
11401140 else throw("Strict value is not equal to itself.")
11411141 }
11421142 else {
11431143 let capAmount = (marketAvailable - totalMarketAmount)
11441144 if ((0 >= capAmount))
11451145 then $Tuple2(nil, 0)
11461146 else {
11471147 let marketLoanPercent = fraction(totalMarketAmountWithLoan, SCALE8, totalMarketAmount)
11481148 let tokensMarketForFeeLoan = fraction(capAmount, marketLoanPercent, SCALE8)
11491149 let tokensMarketForForFeeNoLoan = (capAmount - tokensMarketForFeeLoan)
11501150 let axlyMarketFeeLoan = fraction(tokensMarketForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
11511151 let axlyMarketFeeNoLoan = fraction(tokensMarketForForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
11521152 let axlyMarketFee = (axlyMarketFeeLoan + axlyMarketFeeNoLoan)
11531153 if ((axlyMarketFee > marketBalance))
11541154 then $Tuple2(nil, 0)
11551155 else {
11561156 let stakedMarketAmount = (capAmount - axlyMarketFee)
11571157 let stakedMarketLoan = fraction(stakedMarketAmount, marketLoanPercent, SCALE8)
11581158 let stakedMarketNoLoan = (stakedMarketAmount - stakedMarketLoan)
11591159 let curPoolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
11601160 let curPoolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
11611161 let newInterestMarketLoan = if ((totalMarketAmountWithLoan > 0))
11621162 then (curPoolInterestMarketLoan + fraction(stakedMarketLoan, SCALE10, totalMarketAmountWithLoan))
11631163 else 0
11641164 let newInterestMarketNoLoan = if (((totalMarketAmount - totalMarketAmountWithLoan) > 0))
11651165 then (curPoolInterestMarketNoLoan + fraction(stakedMarketNoLoan, SCALE10, (totalMarketAmount - totalMarketAmountWithLoan)))
11661166 else 0
11671167 let unstakedAmount = unstakeLP(pool, pType, shareId, axlyMarketFee, true)
11681168 if ((unstakedAmount == unstakedAmount))
11691169 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)
11701170 else throw("Strict value is not equal to itself.")
11711171 }
11721172 }
11731173 }
11741174 }
11751175 else throw("Strict value is not equal to itself.")
11761176 }
11771177 else throw("Strict value is not equal to itself.")
11781178 }
11791179
11801180
11811181 func userCanWithdrawShareCalc (user,pool,posId,borrowed,isMarketPos) = {
11821182 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
11831183 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
11841184 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
11851185 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
11861186 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
11871187 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
11881188 let poolInterest = if (borrowed)
11891189 then if (isMarketPos)
11901190 then poolInterestMarketLoan
11911191 else poolInterestLoan
11921192 else if (isMarketPos)
11931193 then poolInterestMarketNoLoan
11941194 else poolInterestNoLoan
11951195 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
11961196 }
11971197
11981198
11991199 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
12001200 let feeType = if (isBorrowed)
12011201 then STOPLOSS_LOAN
12021202 else STOPLOSS_FEE_NO_LOAN
12031203 if (stopLoss)
12041204 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
12051205 else 0
12061206 }
12071207
12081208
12091209 func withdrawToUser (user,pool,posId,stopLoss,withdrawToken) = {
12101210 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
12111211 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
12121212 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
12131213 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed, fromMarket)
12141214 let poolTotalShare = getPoolTotalShare(pool)
12151215 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
12161216 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
12171217 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
12181218 let userAddr = Address(fromBase58String(user))
12191219 let poolAddr = Address(fromBase58String(pool))
12201220 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1221- let $t03916639238 = getPoolData(poolAddr, pType)
1222- let idAStr = $t03916639238._1
1223- let idBStr = $t03916639238._2
1224- let balA = $t03916639238._3
1225- let balB = $t03916639238._4
1226- let shareId = $t03916639238._5
1227- let $t03924139308 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1228- let idA = $t03924139308._1
1229- let idB = $t03924139308._2
1221+ let $t03917439246 = getPoolData(poolAddr, pType)
1222+ let idAStr = $t03917439246._1
1223+ let idBStr = $t03917439246._2
1224+ let balA = $t03917439246._3
1225+ let balB = $t03917439246._4
1226+ let shareId = $t03917439246._5
1227+ let $t03924939316 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1228+ let idA = $t03924939316._1
1229+ let idB = $t03924939316._2
12301230 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
12311231 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12321232 let cBalABefore = accountBalance(idA)
12331233 if ((cBalABefore == cBalABefore))
12341234 then {
12351235 let cBalBBefore = accountBalance(idB)
12361236 if ((cBalBBefore == cBalBBefore))
12371237 then {
12381238 let inv = if ((pType == SF_POOL))
12391239 then {
12401240 let inv = unstakeLP(pool, pType, shareId, stopLossFee, fromMarket)
12411241 if ((inv == inv))
12421242 then invoke(poolAddr, "callFunction", ["withdraw", [toString((userCanWithdraw - stopLossFee))]], nil)
12431243 else throw("Strict value is not equal to itself.")
12441244 }
12451245 else if ((pType == WX_POOL))
12461246 then {
12471247 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee), fromMarket)
12481248 if ((inv == inv))
12491249 then if ((proxyAddr == ""))
12501250 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12511251 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12521252 else throw("Strict value is not equal to itself.")
12531253 }
12541254 else unknownPoolType()
12551255 if ((inv == inv))
12561256 then {
12571257 let cBalAAfter = accountBalance(idA)
12581258 if ((cBalAAfter == cBalAAfter))
12591259 then {
12601260 let cBalBAfter = accountBalance(idB)
12611261 if ((cBalBAfter == cBalBAfter))
12621262 then {
1263- let $t04031640405 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1264- let tokensAmountA = $t04031640405._1
1265- let tokensAmountB = $t04031640405._2
1266- let $t04040841653 = if (isBorrowed)
1263+ let $t04032440413 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1264+ let tokensAmountA = $t04032440413._1
1265+ let tokensAmountB = $t04032440413._2
1266+ let $t04041641661 = if (isBorrowed)
12671267 then {
12681268 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12691269 let debt = {
12701270 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
12711271 if ($isInstanceOf(@, "Int"))
12721272 then @
12731273 else throw(($getType(@) + " couldn't be cast to Int"))
12741274 }
12751275 if ((debt == debt))
12761276 then {
12771277 let amountToGetEx = if (if ((borrowAsset == idAStr))
12781278 then (debt > tokensAmountA)
12791279 else false)
12801280 then (debt - tokensAmountA)
12811281 else if (if ((borrowAsset == idBStr))
12821282 then (debt > tokensAmountB)
12831283 else false)
12841284 then (debt - tokensAmountB)
12851285 else 0
12861286 let exInv = if ((amountToGetEx > 0))
12871287 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
12881288 else nil
12891289 if ((exInv == exInv))
12901290 then {
12911291 let cBalAAfterRepay = accountBalance(idA)
12921292 if ((cBalAAfterRepay == cBalAAfterRepay))
12931293 then {
12941294 let cBalBAfterRepay = accountBalance(idB)
12951295 if ((cBalBAfterRepay == cBalBAfterRepay))
12961296 then {
12971297 let closeDbtInv = if ((debt > 0))
12981298 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId), shareId], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
12991299 else 0
13001300 if ((closeDbtInv == closeDbtInv))
13011301 then if ((borrowAsset == idAStr))
13021302 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
13031303 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
13041304 else throw("Strict value is not equal to itself.")
13051305 }
13061306 else throw("Strict value is not equal to itself.")
13071307 }
13081308 else throw("Strict value is not equal to itself.")
13091309 }
13101310 else throw("Strict value is not equal to itself.")
13111311 }
13121312 else throw("Strict value is not equal to itself.")
13131313 }
13141314 else $Tuple2(tokensAmountA, tokensAmountB)
1315- let toUserA = $t04040841653._1
1316- let toUserB = $t04040841653._2
1315+ let toUserA = $t04041641661._1
1316+ let toUserB = $t04041641661._2
13171317 let poolTotalLoanEntries = if (isBorrowed)
13181318 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
13191319 else nil
13201320 let poolTotalMarketEntries = if (fromMarket)
13211321 then ([IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userCanWithdraw))] ++ (if (isBorrowed)
13221322 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
13231323 else nil))
13241324 else nil
1325- let $t04206642461 = if (if ((withdrawToken == idAStr))
1325+ let $t04207442469 = if (if ((withdrawToken == idAStr))
13261326 then (toUserB > 0)
13271327 else false)
13281328 then {
13291329 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserB, idBStr, idAStr)
13301330 if ((amtGet == amtGet))
13311331 then $Tuple2((toUserA + amtGet), 0)
13321332 else throw("Strict value is not equal to itself.")
13331333 }
13341334 else if (if ((withdrawToken == idBStr))
13351335 then (toUserA > 0)
13361336 else false)
13371337 then {
13381338 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserA, idAStr, idBStr)
13391339 if ((amtGet == amtGet))
13401340 then $Tuple2(0, (toUserB + amtGet))
13411341 else throw("Strict value is not equal to itself.")
13421342 }
13431343 else $Tuple2(toUserA, toUserB)
1344- let toUserACalc = $t04206642461._1
1345- let toUserBCalc = $t04206642461._2
1344+ let toUserACalc = $t04207442469._1
1345+ let toUserBCalc = $t04207442469._2
13461346 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))
13471347 $Tuple2(entries, [toUserACalc, toUserBCalc])
13481348 }
13491349 else throw("Strict value is not equal to itself.")
13501350 }
13511351 else throw("Strict value is not equal to itself.")
13521352 }
13531353 else throw("Strict value is not equal to itself.")
13541354 }
13551355 else throw("Strict value is not equal to itself.")
13561356 }
13571357 else throw("Strict value is not equal to itself.")
13581358 }
13591359
13601360
13611361 func liquidatePos (caller,user,posId,lAmount) = {
13621362 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13631363 let borrowAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), "There are no borrow position")
13641364 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
13651365 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
13661366 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, true, fromMarket)
13671367 let poolTotalShare = getPoolTotalShare(pool)
13681368 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
13691369 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
13701370 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
13711371 let userAddr = Address(fromBase58String(user))
13721372 let poolAddr = Address(fromBase58String(pool))
13731373 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1374- let $t04438644458 = getPoolData(poolAddr, pType)
1375- let idAStr = $t04438644458._1
1376- let idBStr = $t04438644458._2
1377- let balA = $t04438644458._3
1378- let balB = $t04438644458._4
1379- let shareId = $t04438644458._5
1380- let $t04446144528 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1381- let idA = $t04446144528._1
1382- let idB = $t04446144528._2
1374+ let $t04439444466 = getPoolData(poolAddr, pType)
1375+ let idAStr = $t04439444466._1
1376+ let idBStr = $t04439444466._2
1377+ let balA = $t04439444466._3
1378+ let balB = $t04439444466._4
1379+ let shareId = $t04439444466._5
1380+ let $t04446944536 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1381+ let idA = $t04446944536._1
1382+ let idB = $t04446944536._2
13831383 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
13841384 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13851385 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
13861386 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
13871387 if ((borrowAmount == 0))
13881388 then throw("You can't liquidate position without borrow")
13891389 else {
13901390 let cBalABefore = accountBalance(idA)
13911391 if ((cBalABefore == cBalABefore))
13921392 then {
13931393 let cBalBBefore = accountBalance(idB)
13941394 if ((cBalBBefore == cBalBBefore))
13951395 then {
13961396 let inv = if ((pType == SF_POOL))
13971397 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
13981398 else if ((pType == WX_POOL))
13991399 then {
14001400 let inv = unstakeLP(pool, pType, shareId, userCanWithdraw, fromMarket)
14011401 if ((inv == inv))
14021402 then if ((proxyAddr == ""))
14031403 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
14041404 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
14051405 else throw("Strict value is not equal to itself.")
14061406 }
14071407 else unknownPoolType()
14081408 if ((inv == inv))
14091409 then {
14101410 let cBalAAfter = accountBalance(idA)
14111411 if ((cBalAAfter == cBalAAfter))
14121412 then {
14131413 let cBalBAfter = accountBalance(idB)
14141414 if ((cBalBAfter == cBalBAfter))
14151415 then {
1416- let $t04571245801 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1417- let tokensAmountA = $t04571245801._1
1418- let tokensAmountB = $t04571245801._2
1416+ let $t04572045809 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1417+ let tokensAmountA = $t04572045809._1
1418+ let tokensAmountB = $t04572045809._2
14191419 let amountToGetEx = if (if ((borrowAsset == idAStr))
14201420 then (lAmount > tokensAmountA)
14211421 else false)
14221422 then (lAmount - tokensAmountA)
14231423 else if (if ((borrowAsset == idBStr))
14241424 then (lAmount > tokensAmountB)
14251425 else false)
14261426 then (lAmount - tokensAmountB)
14271427 else 0
14281428 let exInv = if ((amountToGetEx > 0))
14291429 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
14301430 else nil
14311431 if ((exInv == exInv))
14321432 then {
14331433 let cBalAAfterRepay = accountBalance(idA)
14341434 if ((cBalAAfterRepay == cBalAAfterRepay))
14351435 then {
14361436 let cBalBAfterRepay = accountBalance(idB)
14371437 if ((cBalBAfterRepay == cBalBAfterRepay))
14381438 then {
1439- let $t04630746534 = if ((borrowAsset == idAStr))
1439+ let $t04631546542 = if ((borrowAsset == idAStr))
14401440 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
14411441 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
1442- let toUserA = $t04630746534._1
1443- let toUserB = $t04630746534._2
1444- let $t04653746614 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1445- let balAAfter = $t04653746614._1
1446- let balBAfter = $t04653746614._2
1447- let $t04661746748 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1448- let userStaked = $t04661746748._1
1449- let axlyFee = $t04661746748._2
1442+ let toUserA = $t04631546542._1
1443+ let toUserB = $t04631546542._2
1444+ let $t04654546622 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1445+ let balAAfter = $t04654546622._1
1446+ let balBAfter = $t04654546622._2
1447+ let $t04662546756 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1448+ let userStaked = $t04662546756._1
1449+ let axlyFee = $t04662546756._2
14501450 let userLpLiqudated = (userCanWithdraw - userStaked)
1451- let $t04680747152 = if (fromMarket)
1451+ let $t04681547160 = if (fromMarket)
14521452 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
14531453 else $Tuple2(poolInterestLoan, nil)
1454- let curPoolInterest = $t04680747152._1
1455- let poolTotalMarketEntries = $t04680747152._2
1454+ let curPoolInterest = $t04681547160._1
1455+ let poolTotalMarketEntries = $t04681547160._2
14561456 $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)
14571457 }
14581458 else throw("Strict value is not equal to itself.")
14591459 }
14601460 else throw("Strict value is not equal to itself.")
14611461 }
14621462 else throw("Strict value is not equal to itself.")
14631463 }
14641464 else throw("Strict value is not equal to itself.")
14651465 }
14661466 else throw("Strict value is not equal to itself.")
14671467 }
14681468 else throw("Strict value is not equal to itself.")
14691469 }
14701470 else throw("Strict value is not equal to itself.")
14711471 }
14721472 else throw("Strict value is not equal to itself.")
14731473 }
14741474 }
14751475
14761476
14771477 func parseRequest (requestId) = {
14781478 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
14791479 let user = request[0]
14801480 let pool = request[1]
14811481 let pmtA = parseIntValue(request[2])
14821482 let AId = request[3]
14831483 let pmtB = parseIntValue(request[4])
14841484 let BId = request[5]
14851485 let balA = parseIntValue(request[6])
14861486 let balB = parseIntValue(request[7])
14871487 let shareId = request[8]
14881488 let bwAsset = request[9]
14891489 let bwAmount = parseIntValue(request[10])
14901490 let stakeToMarket = (request[11] == "true")
14911491 $Tuple12(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount, stakeToMarket)
14921492 }
14931493
14941494
14951495 func calcBorrowAmount (pmtA,pmtB,balA,balB,aId,bId,leverage,borrowId) = {
14961496 let priceOracleA = valueOrElse(getInteger(priceOracleAddr, (aId + kPriceInOracle)), -1)
14971497 let priceOracleB = valueOrElse(getInteger(priceOracleAddr, (bId + kPriceInOracle)), -1)
14981498 if (if ((borrowId != aId))
14991499 then (borrowId != bId)
15001500 else false)
15011501 then throw("Wrong borrow asset")
15021502 else if (if ((priceOracleA == -1))
15031503 then (priceOracleB == -1)
15041504 else false)
15051505 then throw("Can't calc deposit price, no token prices in oracle")
15061506 else {
15071507 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
15081508 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
15091509 let dPriceA = if ((priceOracleA != -1))
15101510 then priceOracleA
15111511 else fraction(fraction(balB, decPrA, balA), priceOracleB, decPrB)
15121512 let dPriceB = if ((priceOracleB != -1))
15131513 then priceOracleB
15141514 else fraction(fraction(balA, decPrB, balB), priceOracleA, decPrA)
15151515 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1516- let $t04929649393 = if ((borrowId == aId))
1516+ let $t04930449401 = if ((borrowId == aId))
15171517 then $Tuple2(dPriceA, decPrA)
15181518 else $Tuple2(dPriceB, decPrB)
1519- let borrowPrice = $t04929649393._1
1520- let borrowDecPr = $t04929649393._2
1519+ let borrowPrice = $t04930449401._1
1520+ let borrowDecPr = $t04930449401._2
15211521 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
15221522 }
15231523 }
15241524
15251525
15261526 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
15271527 then if ((assetIdToStr(pmts[0].assetId) != AId))
15281528 then throw("Wrong payment asset A")
15291529 else if ((assetIdToStr(pmts[1].assetId) != BId))
15301530 then throw("Wrong payment asset B")
15311531 else $Tuple2(pmts[0].amount, pmts[1].amount)
15321532 else if ((size(pmts) == 1))
15331533 then if ((assetIdToStr(pmts[0].assetId) == AId))
15341534 then $Tuple2(pmts[0].amount, 0)
15351535 else if ((assetIdToStr(pmts[0].assetId) == BId))
15361536 then $Tuple2(0, pmts[0].amount)
15371537 else throw("Wrong payment")
15381538 else throw("One or two payments expected")
15391539
15401540
15411541 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
15421542 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
15431543 if ((0 > pri))
15441544 then (pri * -1)
15451545 else pri
15461546 }
15471547
15481548
15491549 func claimAndCheckAmnt (pool,pType,claim,amountToExchange,amountFromBalance) = {
1550- let $t05041451265 = if (claim)
1550+ let $t05042251273 = if (claim)
15511551 then {
15521552 let claimed = claimFarmed(pType, pool)
15531553 if ((amountToExchange > 0))
15541554 then $Tuple2(amountToExchange, claimed._2)
15551555 else $Tuple2((claimed._1 + amountFromBalance), claimed._2)
15561556 }
15571557 else {
15581558 let claimedAsset = if ((pType == SF_POOL))
15591559 then SWOPID
15601560 else if ((pType == WX_POOL))
15611561 then {
15621562 let proxyAddrStr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
15631563 let inv = if ((proxyAddrStr != ""))
15641564 then {
15651565 let proxyAddr = addressFromStringValue(proxyAddrStr)
15661566 let proxyBalance = assetBalance(proxyAddr, WXID)
15671567 if ((proxyBalance > 0))
15681568 then invoke(proxyAddr, "wxClaimFinalized", [proxyBalance], nil)
15691569 else unit
15701570 }
15711571 else unit
15721572 if ((inv == inv))
15731573 then WXID
15741574 else throw("Strict value is not equal to itself.")
15751575 }
15761576 else unknownPoolType()
15771577 $Tuple2((amountToExchange + amountFromBalance), claimedAsset)
15781578 }
1579- if (($t05041451265 == $t05041451265))
1579+ if (($t05042251273 == $t05042251273))
15801580 then {
1581- let asset = $t05041451265._2
1582- let amount = $t05041451265._1
1581+ let asset = $t05042251273._2
1582+ let amount = $t05042251273._1
15831583 let bal = accountBalance(asset)
15841584 if ((bal == bal))
15851585 then if ((amount > bal))
15861586 then throw("To big amount to exchange")
15871587 else $Tuple2(amount, asset)
15881588 else throw("Strict value is not equal to itself.")
15891589 }
15901590 else throw("Strict value is not equal to itself.")
15911591 }
15921592
15931593
15941594 @Callable(i)
15951595 func getPoolInfoREADONLY (pool) = {
15961596 let poolAddr = addressFromStringValue(pool)
15971597 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1598- let $t05161751707 = getPoolData(Address(fromBase58String(pool)), pType)
1599- let AId = $t05161751707._1
1600- let BId = $t05161751707._2
1601- let balA = $t05161751707._3
1602- let balB = $t05161751707._4
1603- let shareId = $t05161751707._5
1598+ let $t05162551715 = getPoolData(Address(fromBase58String(pool)), pType)
1599+ let AId = $t05162551715._1
1600+ let BId = $t05162551715._2
1601+ let balA = $t05162551715._3
1602+ let balB = $t05162551715._4
1603+ let shareId = $t05162551715._5
16041604 let shareSupply = getShareSupply(poolAddr, pType, shareId)
16051605 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
16061606 }
16071607
16081608
16091609
16101610 @Callable(i)
16111611 func getShareAssetPriceREADONLY (shareId) = {
16121612 let sharePrices = getSharePrice(shareId)
16131613 $Tuple2(nil, sharePrices)
16141614 }
16151615
16161616
16171617
16181618 @Callable(i)
16191619 func getUserPositionShareAmountREADONLY (user,posNum) = {
16201620 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
16211621 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
16221622 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum) + kUserPositionInPMarket)), false)
16231623 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0), fromMarket)
16241624 $Tuple2(nil, userCanWithdraw)
16251625 }
16261626
16271627
16281628
16291629 @Callable(i)
16301630 func getUserPositionREADONLY (user,pools,posNum) = {
16311631 func userPos (a,pool) = {
1632- let $t05270552775 = a
1633- let wAmountsA = $t05270552775._1
1634- let wAmountsB = $t05270552775._2
1635- let debts = $t05270552775._3
1636- let eqWAmountsA = $t05270552775._4
1637- let eqWAmountsB = $t05270552775._5
1638- let index = $t05270552775._6
1632+ let $t05271352783 = a
1633+ let wAmountsA = $t05271352783._1
1634+ let wAmountsB = $t05271352783._2
1635+ let debts = $t05271352783._3
1636+ let eqWAmountsA = $t05271352783._4
1637+ let eqWAmountsB = $t05271352783._5
1638+ let index = $t05271352783._6
16391639 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
16401640 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
16411641 else {
16421642 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1643- let $t05305453144 = getPoolData(Address(fromBase58String(pool)), pType)
1644- let AId = $t05305453144._1
1645- let BId = $t05305453144._2
1646- let balA = $t05305453144._3
1647- let balB = $t05305453144._4
1648- let shareId = $t05305453144._5
1643+ let $t05306253152 = getPoolData(Address(fromBase58String(pool)), pType)
1644+ let AId = $t05306253152._1
1645+ let BId = $t05306253152._2
1646+ let balA = $t05306253152._3
1647+ let balB = $t05306253152._4
1648+ let shareId = $t05306253152._5
16491649 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
16501650 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
16511651 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1652- let $t05349453614 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1653- let wAmountA = $t05349453614._1
1654- let wAmountB = $t05349453614._2
1652+ let $t05350253622 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1653+ let wAmountA = $t05350253622._1
1654+ let wAmountB = $t05350253622._2
16551655 if ((borrowAmount > 0))
16561656 then {
16571657 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
16581658 let debt = {
16591659 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
16601660 if ($isInstanceOf(@, "Int"))
16611661 then @
16621662 else throw(($getType(@) + " couldn't be cast to Int"))
16631663 }
16641664 if ((debt == debt))
16651665 then {
16661666 let amountToGetEx = if (if ((borrowAsset == AId))
16671667 then (debt > wAmountA)
16681668 else false)
16691669 then (debt - wAmountA)
16701670 else if (if ((borrowAsset == BId))
16711671 then (debt > wAmountB)
16721672 else false)
16731673 then (debt - wAmountB)
16741674 else 0
16751675 let amountToPay = if ((amountToGetEx > 0))
16761676 then if ((pType == SF_POOL))
16771677 then {
16781678 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
16791679 ex._2
16801680 }
16811681 else if ((pType == WX_POOL))
16821682 then {
16831683 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
16841684 ex._2
16851685 }
16861686 else unknownPoolType()
16871687 else 0
1688- let $t05452654745 = if ((borrowAsset == AId))
1688+ let $t05453454753 = if ((borrowAsset == AId))
16891689 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
16901690 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1691- let eqWAmountA = $t05452654745._1
1692- let eqWAmountB = $t05452654745._2
1691+ let eqWAmountA = $t05453454753._1
1692+ let eqWAmountB = $t05453454753._2
16931693 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
16941694 }
16951695 else throw("Strict value is not equal to itself.")
16961696 }
16971697 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
16981698 }
16991699 }
17001700
1701- let $t05500055111 = {
1701+ let $t05500855119 = {
17021702 let $l = pools
17031703 let $s = size($l)
17041704 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
17051705 func $f0_1 ($a,$i) = if (($i >= $s))
17061706 then $a
17071707 else userPos($a, $l[$i])
17081708
17091709 func $f0_2 ($a,$i) = if (($i >= $s))
17101710 then $a
17111711 else throw("List size exceeds 20")
17121712
17131713 $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)
17141714 }
1715- let wAmountsA = $t05500055111._1
1716- let wAmountsB = $t05500055111._2
1717- let debts = $t05500055111._3
1718- let eqWAmountsA = $t05500055111._4
1719- let eqWAmountsB = $t05500055111._5
1715+ let wAmountsA = $t05500855119._1
1716+ let wAmountsB = $t05500855119._2
1717+ let debts = $t05500855119._3
1718+ let eqWAmountsA = $t05500855119._4
1719+ let eqWAmountsB = $t05500855119._5
17201720 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
17211721 }
17221722
17231723
17241724
17251725 @Callable(i)
17261726 func replenish (pool,leverage,borrowId,stakeToMarket) = valueOrElse(isActiveForUsers(), {
17271727 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
17281728 let allowedBAssets = valueOrElse(getString(this, (pool + kPoolAllowedBorrowAssets)), "")
17291729 if (!(isPoolActive(pool, pType)))
17301730 then throw("Pool not active at this moment")
17311731 else if (if ((100 > leverage))
17321732 then true
17331733 else (leverage > 300))
17341734 then throw("Leverage can't be <100 and >300")
17351735 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
17361736 then (leverage > 100)
17371737 else false)
17381738 then throw("You can't borrow in this pool")
17391739 else if (if (if ((leverage > 100))
17401740 then (allowedBAssets != "")
17411741 else false)
17421742 then !(containsElement(split(allowedBAssets, ","), borrowId))
17431743 else false)
17441744 then throw("You can't borrow this asset")
17451745 else if (if (stakeToMarket)
17461746 then !(valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false))
17471747 else false)
17481748 then throw("This pool can't stake to puzzle market")
17491749 else {
1750- let $t05610456194 = getPoolData(Address(fromBase58String(pool)), pType)
1751- let AId = $t05610456194._1
1752- let BId = $t05610456194._2
1753- let balA = $t05610456194._3
1754- let balB = $t05610456194._4
1755- let shareId = $t05610456194._5
1750+ let $t05611256202 = getPoolData(Address(fromBase58String(pool)), pType)
1751+ let AId = $t05611256202._1
1752+ let BId = $t05611256202._2
1753+ let balA = $t05611256202._3
1754+ let balB = $t05611256202._4
1755+ let shareId = $t05611256202._5
17561756 if (if ((borrowId != AId))
17571757 then (borrowId != BId)
17581758 else false)
17591759 then throw("Wrong borrow asset")
17601760 else {
1761- let $t05627556334 = parseReplenishPmts(i.payments, AId, BId)
1762- let pmtA = $t05627556334._1
1763- let pmtB = $t05627556334._2
1761+ let $t05628356342 = parseReplenishPmts(i.payments, AId, BId)
1762+ let pmtA = $t05628356342._1
1763+ let pmtB = $t05628356342._2
17641764 let user = toString(i.caller)
17651765 let newPosNum = getNewUserPositionNumber(user)
17661766 if ((leverage > 100))
17671767 then {
17681768 let borrowAmount = calcBorrowAmount(pmtA, pmtB, balA, balB, AId, BId, leverage, borrowId)
17691769 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
17701770 let newRequestId = {
17711771 let @ = invoke(this, "createNewRequest", [request], nil)
17721772 if ($isInstanceOf(@, "Int"))
17731773 then @
17741774 else throw(($getType(@) + " couldn't be cast to Int"))
17751775 }
17761776 if ((newRequestId == newRequestId))
17771777 then {
17781778 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
17791779 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
17801780 if ((inv == inv))
17811781 then {
17821782 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1783- let $t05736957463 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1784- if (($t05736957463 == $t05736957463))
1783+ let $t05737757471 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1784+ if (($t05737757471 == $t05737757471))
17851785 then {
1786- let newBalB = $t05736957463._2
1787- let newBalA = $t05736957463._1
1786+ let newBalB = $t05737757471._2
1787+ let newBalA = $t05737757471._1
17881788 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1789- let $t05753357648 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1790- let wAmountA = $t05753357648._1
1791- let wAmountB = $t05753357648._2
1789+ let $t05754157656 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1790+ let wAmountA = $t05754157656._1
1791+ let wAmountB = $t05754157656._2
17921792 let futureBorrowApy = invoke(getLendSrvAddr(), "calculateTokenInterest", [borrowId, false], nil)
17931793 if ((futureBorrowApy == futureBorrowApy))
17941794 then $Tuple2(nil, [prImpact, wAmountA, wAmountB, futureBorrowApy])
17951795 else throw("Strict value is not equal to itself.")
17961796 }
17971797 else throw("Strict value is not equal to itself.")
17981798 }
17991799 else throw("Strict value is not equal to itself.")
18001800 }
18011801 else throw("Strict value is not equal to itself.")
18021802 }
18031803 else {
1804- let $t05782057950 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1805- if (($t05782057950 == $t05782057950))
1804+ let $t05782857958 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1805+ if (($t05782857958 == $t05782857958))
18061806 then {
1807- let axlyFee = $t05782057950._2
1808- let userStaked = $t05782057950._1
1809- let $t05795658050 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1810- if (($t05795658050 == $t05795658050))
1807+ let axlyFee = $t05782857958._2
1808+ let userStaked = $t05782857958._1
1809+ let $t05796458058 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1810+ if (($t05796458058 == $t05796458058))
18111811 then {
1812- let newBalB = $t05795658050._2
1813- let newBalA = $t05795658050._1
1812+ let newBalB = $t05796458058._2
1813+ let newBalA = $t05796458058._1
18141814 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1815- let $t05812058235 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1816- let wAmountA = $t05812058235._1
1817- let wAmountB = $t05812058235._2
1815+ let $t05812858243 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1816+ let wAmountA = $t05812858243._1
1817+ let wAmountB = $t05812858243._2
18181818 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB, 0])
18191819 }
18201820 else throw("Strict value is not equal to itself.")
18211821 }
18221822 else throw("Strict value is not equal to itself.")
18231823 }
18241824 }
18251825 }
18261826 })
18271827
18281828
18291829
18301830 @Callable(i)
18311831 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
18321832 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
18331833 if (!(isPoolActive(pool, pType)))
18341834 then throw("Pool not active at this moment")
18351835 else withdrawToUser(toString(i.caller), pool, toString(posId), false, "")
18361836 })
18371837
18381838
18391839
18401840 @Callable(i)
18411841 func withdrawOneToken (pool,posId,tokenId) = valueOrElse(isActiveForUsers(), {
18421842 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
18431843 if (!(isPoolActive(pool, pType)))
18441844 then throw("Pool not active at this moment")
18451845 else withdrawToUser(toString(i.caller), pool, toString(posId), false, tokenId)
18461846 })
18471847
18481848
18491849
18501850 @Callable(i)
18511851 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
18521852 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
18531853 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
18541854 if (!(isPoolActive(poolId, pType)))
18551855 then throw("Pool not active at this moment")
18561856 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
18571857 then throw("There are no user position")
18581858 else if ((0 >= price))
18591859 then throw("Price must be greater than 0")
18601860 else if ((price > tokenOraclePrice))
18611861 then throw("Price must be less than current token price")
18621862 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
18631863 })
18641864
18651865
18661866
18671867 @Callable(i)
18681868 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
18691869 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
18701870 if (!(isPoolActive(poolId, pType)))
18711871 then throw("Pool not active at this moment")
18721872 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
18731873 then throw("No entry")
18741874 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
18751875 })
18761876
18771877
18781878
18791879 @Callable(i)
18801880 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
18811881 then throw("Already inited")
18821882 else if (!(isDefined(addressFromString(moneyBoxAddr))))
18831883 then throw("moneyBoxAddr is not correct address")
18841884 else if (!(isDefined(addressFromString(sfFarmingAddr))))
18851885 then throw("sfFarmingAddr is not correct address")
18861886 else if (!(isDefined(addressFromString(lendAddr))))
18871887 then throw("lendAddr is not correct address")
18881888 else if (!(isDefined(addressFromString(priceOracleAddr))))
18891889 then throw("priceOracleAddr is not correct address")
18901890 else if (!(isDefined(addressFromString(keeperExContract))))
18911891 then throw("keeperExContract is not correct address")
18921892 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
18931893 then throw("swopAssetId is not correct asset id")
18941894 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
18951895 then throw("swopAssetId is not correct asset id")
18961896 else if ((size(fromBase58String(operatorPubKey)) != 32))
18971897 then throw("operatorPubKey is not correct")
18981898 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
18991899 then throw("group1Admin1PubKey is not correct")
19001900 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
19011901 then throw("group1Admin2PubKey is not correct")
19021902 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
19031903 then throw("group2Admin1PubKey is not correct")
19041904 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
19051905 then throw("group2Admin2PubKey is not correct")
19061906 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)])
19071907
19081908
19091909
19101910 @Callable(i)
19111911 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
19121912 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
19131913 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
19141914 })
19151915
19161916
19171917
19181918 @Callable(i)
19191919 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1920- let $t06345863577 = parseRequest(requestId)
1921- let user = $t06345863577._1
1922- let pool = $t06345863577._2
1923- let pmtA = $t06345863577._3
1924- let AId = $t06345863577._4
1925- let pmtB = $t06345863577._5
1926- let BId = $t06345863577._6
1927- let balA = $t06345863577._7
1928- let balB = $t06345863577._8
1929- let shareId = $t06345863577._9
1930- let bwAsset = $t06345863577._10
1931- let bwAmount = $t06345863577._11
1932- let stakeToMarket = $t06345863577._12
1920+ let $t06346663585 = parseRequest(requestId)
1921+ let user = $t06346663585._1
1922+ let pool = $t06346663585._2
1923+ let pmtA = $t06346663585._3
1924+ let AId = $t06346663585._4
1925+ let pmtB = $t06346663585._5
1926+ let BId = $t06346663585._6
1927+ let balA = $t06346663585._7
1928+ let balB = $t06346663585._8
1929+ let shareId = $t06346663585._9
1930+ let bwAsset = $t06346663585._10
1931+ let bwAmount = $t06346663585._11
1932+ let stakeToMarket = $t06346663585._12
19331933 if ((size(i.payments) != 1))
19341934 then throw("Wrong payment size")
19351935 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
19361936 then true
19371937 else (i.payments[0].amount != bwAmount))
19381938 then throw("Wrong payment")
19391939 else {
1940- let $t06376763867 = if ((AId == bwAsset))
1940+ let $t06377563875 = if ((AId == bwAsset))
19411941 then $Tuple2((pmtA + bwAmount), pmtB)
19421942 else $Tuple2(pmtA, (pmtB + bwAmount))
1943- let pmtAllA = $t06376763867._1
1944- let pmtAllB = $t06376763867._2
1943+ let pmtAllA = $t06377563875._1
1944+ let pmtAllB = $t06377563875._2
19451945 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1946- let $t06394964079 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1947- let userStaked = $t06394964079._1
1948- let axlyFee = $t06394964079._2
1946+ let $t06395764087 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1947+ let userStaked = $t06395764087._1
1948+ let axlyFee = $t06395764087._2
19491949 let posNum = getNewUserPositionNumber(user)
19501950 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
19511951 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1952- let $t06445464569 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1953- let wAmountA = $t06445464569._1
1954- let wAmountB = $t06445464569._2
1952+ let $t06446264577 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1953+ let wAmountA = $t06446264577._1
1954+ let wAmountB = $t06446264577._2
19551955 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
19561956 }
19571957 }))
19581958
19591959
19601960
19611961 @Callable(i)
19621962 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), liquidatePos(i.caller, user, posId, liquidateAmount)))
19631963
19641964
19651965
19661966 @Callable(i)
19671967 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19681968 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
19691969 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
19701970 if ((tokenOraclePrice > stopLossPrice))
19711971 then throw("Token price greater stop loss price")
19721972 else {
19731973 let res = withdrawToUser(user, pool, toString(posId), true, "")
19741974 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
19751975 }
19761976 }))
19771977
19781978
19791979
19801980 @Callable(i)
19811981 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19821982 let pType = getStringValue(this, (kPool + pool))
19831983 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
19841984 let poolAddr = Address(fromBase58String(pool))
1985- let $t06598566051 = getPoolData(poolAddr, pType)
1986- let AId = $t06598566051._1
1987- let BId = $t06598566051._2
1988- let balA = $t06598566051._3
1989- let balB = $t06598566051._4
1990- let shareId = $t06598566051._5
1985+ let $t06599366059 = getPoolData(poolAddr, pType)
1986+ let AId = $t06599366059._1
1987+ let BId = $t06599366059._2
1988+ let balA = $t06599366059._3
1989+ let balB = $t06599366059._4
1990+ let shareId = $t06599366059._5
19911991 let totalShareAmount = getPoolTotalShare(pool)
19921992 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1993- let $t06618067006 = if ((amountToExchange > 0))
1993+ let $t06618867014 = if ((amountToExchange > 0))
19941994 then {
1995- let $t06624266339 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1996- if (($t06624266339 == $t06624266339))
1995+ let $t06625066347 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1996+ if (($t06625066347 == $t06625066347))
19971997 then {
1998- let claimedAsset = $t06624266339._2
1999- let claimedAmount = $t06624266339._1
1998+ let claimedAsset = $t06625066347._2
1999+ let claimedAmount = $t06625066347._1
20002000 let rArgs = split(route, "__")
20012001 let exchangedAmount = if ((amountToExchange > 0))
20022002 then if ((rArgs[0] == "directSwopfiCPMM"))
20032003 then directSwopfiCPMM(rArgs, tokenToId)
20042004 else if ((rArgs[0] == "routingSwopfi"))
20052005 then directRoutingSwopfi(rArgs, tokenToId)
20062006 else throw("Wrong route")
20072007 else 0
20082008 if ((exchangedAmount == exchangedAmount))
20092009 then {
20102010 let newChange = ((claimedAmount + change) - amountToExchange)
20112011 let changeEntry = if ((newChange >= 0))
20122012 then [IntegerEntry((pool + kPoolCapChange), newChange)]
20132013 else nil
2014- let $t06683666946 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2015- let capEnterise = $t06683666946._1
2016- let staked = $t06683666946._2
2014+ let $t06684466954 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2015+ let capEnterise = $t06684466954._1
2016+ let staked = $t06684466954._2
20172017 $Tuple2((capEnterise ++ changeEntry), staked)
20182018 }
20192019 else throw("Strict value is not equal to itself.")
20202020 }
20212021 else throw("Strict value is not equal to itself.")
20222022 }
20232023 else $Tuple2(nil, 0)
2024- let capEnterise = $t06618067006._1
2025- let staked = $t06618067006._2
2026- let $t06700967126 = if (isMarketPool)
2024+ let capEnterise = $t06618867014._1
2025+ let staked = $t06618867014._2
2026+ let $t06701767134 = if (isMarketPool)
20272027 then capitalizePuzzleMarket(pool, pType, shareId)
20282028 else $Tuple2(nil, 0)
2029- let marketCapEnteris = $t06700967126._1
2030- let stakedMarket = $t06700967126._2
2029+ let marketCapEnteris = $t06701767134._1
2030+ let stakedMarket = $t06701767134._2
20312031 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
20322032 }))
20332033
20342034
20352035
20362036 @Callable(i)
20372037 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
20382038 let pType = getStringValue(this, (kPool + pool))
20392039 let poolAddr = Address(fromBase58String(pool))
2040- let $t06756167627 = getPoolData(poolAddr, pType)
2041- let AId = $t06756167627._1
2042- let BId = $t06756167627._2
2043- let balA = $t06756167627._3
2044- let balB = $t06756167627._4
2045- let shareId = $t06756167627._5
2040+ let $t06756967635 = getPoolData(poolAddr, pType)
2041+ let AId = $t06756967635._1
2042+ let BId = $t06756967635._2
2043+ let balA = $t06756967635._3
2044+ let balB = $t06756967635._4
2045+ let shareId = $t06756967635._5
20462046 let totalShareAmount = getPoolTotalShare(pool)
2047- let $t06767967777 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2048- if (($t06767967777 == $t06767967777))
2047+ let $t06768767785 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2048+ if (($t06768767785 == $t06768767785))
20492049 then {
2050- let claimedAsset = $t06767967777._2
2051- let claimedAmount = $t06767967777._1
2052- let $t06778067906 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2053- let capEnterise = $t06778067906._1
2054- let staked = $t06778067906._2
2050+ let claimedAsset = $t06768767785._2
2051+ let claimedAmount = $t06768767785._1
2052+ let $t06778867914 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2053+ let capEnterise = $t06778867914._1
2054+ let staked = $t06778867914._2
20552055 (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
20562056 }
20572057 else throw("Strict value is not equal to itself.")
20582058 }))
20592059
20602060
20612061
20622062 @Callable(i)
20632063 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow,canPMarket,allowedBorrowAssets) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
20642064 then (type != WX_POOL)
20652065 else false)
20662066 then throw("Wrong type")
20672067 else if (if ((poolType != CPMM))
20682068 then (poolType != FLAT)
20692069 else false)
20702070 then throw("Wrong pool type")
20712071 else {
2072- let $t06856068654 = getPoolData(Address(fromBase58String(poolAddr)), type)
2073- let aId = $t06856068654._1
2074- let bId = $t06856068654._2
2075- let aBal = $t06856068654._3
2076- let bBal = $t06856068654._4
2077- let shareId = $t06856068654._5
2072+ let $t06856868662 = getPoolData(Address(fromBase58String(poolAddr)), type)
2073+ let aId = $t06856868662._1
2074+ let bId = $t06856868662._2
2075+ let aBal = $t06856868662._3
2076+ let bBal = $t06856868662._4
2077+ let shareId = $t06856868662._5
20782078 if ((0 > inFeeNoLoan))
20792079 then throw("inFeeNoLoan must be greater than 0")
20802080 else if ((0 > inFeeLoan))
20812081 then throw("inFeeLoan must be greater than 0")
20822082 else if ((0 > capFeeNoLoan))
20832083 then throw("capFeeNoLoan must be greater than 0")
20842084 else if ((0 > capFeeWithLoan))
20852085 then throw("capFeeWithLoan must be greater than 0")
20862086 else if ((0 > stoplossFeeNoLoan))
20872087 then throw("stoplossFeeNoLoan must be greater than 0")
20882088 else if ((0 > stoplossFeeWithLoan))
20892089 then throw("stoplossFeeWithLoan must be greater than 0")
20902090 else {
20912091 let allowedBorrowAssetsEntry = if ((allowedBorrowAssets != ""))
20922092 then [StringEntry((poolAddr + kPoolAllowedBorrowAssets), allowedBorrowAssets)]
20932093 else nil
20942094 ([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)] ++ allowedBorrowAssetsEntry)
20952095 }
20962096 }))
20972097
20982098
20992099
21002100 @Callable(i)
21012101 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
21022102 then throw(("Can't find pool with addr " + poolAddr))
21032103 else if ((0 > inFeeNoLoan))
21042104 then throw("inFeeNoLoan must be greater than 0")
21052105 else if ((0 > inFeeLoan))
21062106 then throw("inFeeLoan must be greater than 0")
21072107 else if ((0 > capFeeNoLoan))
21082108 then throw("capFeeNoLoan must be greater than 0")
21092109 else if ((0 > capFeeWithLoan))
21102110 then throw("capFeeWithLoan must be greater than 0")
21112111 else if ((0 > stoplossFeeNoLoan))
21122112 then throw("stoplossFeeNoLoan must be greater than 0")
21132113 else if ((0 > stoplossFeeWithLoan))
21142114 then throw("stoplossFeeWithLoan must be greater than 0")
21152115 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)]))
21162116
21172117
21182118
21192119 @Callable(i)
21202120 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
21212121 then throw("dApp already active")
21222122 else [BooleanEntry(kActive, true)])
21232123
21242124
21252125
21262126 @Callable(i)
21272127 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
21282128 then throw("dApp already shutdown")
21292129 else [BooleanEntry(kActive, false)])
21302130
21312131
21322132
21332133 @Callable(i)
21342134 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
21352135 then throw("dApp already active for users")
21362136 else [BooleanEntry(kActiveUsers, true)])
21372137
21382138
21392139
21402140 @Callable(i)
21412141 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
21422142 then throw("dApp already shutdown for users")
21432143 else [BooleanEntry(kActiveUsers, false)])
21442144
21452145
21462146
21472147 @Callable(i)
21482148 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
21492149 then throw("SWOPFI already active")
21502150 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
21512151
21522152
21532153
21542154 @Callable(i)
21552155 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
21562156 then throw("SWOPFI already shutdown")
21572157 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
21582158
21592159
21602160
21612161 @Callable(i)
21622162 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
21632163 then throw("WX already active")
21642164 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
21652165
21662166
21672167
21682168 @Callable(i)
21692169 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
21702170 then throw("WX already shutdown")
21712171 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
21722172
21732173
21742174
21752175 @Callable(i)
21762176 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
21772177 then throw("Unknown pool")
21782178 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
21792179 then throw("Pool already active")
21802180 else [BooleanEntry((pool + kPoolActive), true)])
21812181
21822182
21832183
21842184 @Callable(i)
21852185 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
21862186 then throw("Unknown pool")
21872187 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
21882188 then throw("Pool already shutdown")
21892189 else [BooleanEntry((pool + kPoolActive), false)])
21902190
21912191
21922192 @Verifier(tx)
21932193 func verify () = {
21942194 let multiSignedByAdmins = {
21952195 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
21962196 then 1
21972197 else 0
21982198 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group1Admin2PK))
21992199 then 1
22002200 else 0
22012201 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], group1Admin3PK))
22022202 then 1
22032203 else 0
22042204 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
22052205 }
22062206 multiSignedByAdmins
22072207 }
22082208

github/deemru/w8io/3ef1775 
322.56 ms