tx · 3UQ91Eaq72motrWCaz6mNUV8JjeuGzdRhEdZtEb1sorM

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.07500000 Waves

2024.03.25 17:28 [4099614] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "3UQ91Eaq72motrWCaz6mNUV8JjeuGzdRhEdZtEb1sorM", "fee": 7500000, "feeAssetId": null, "timestamp": 1711376912034, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "", "4btaQRENou5TyWbhV9JJjrHeZKFHU6rfhJHoTNRYefe4MQL7twa1D3UF5oJJvqduF7ojySEHxWXnsANnfYt3juVH", "5Dt9xohE9q7mXpejHNDRhtedqdAVPDwqqeq4BJ8RTLqyyGyqDpdCw36Zw9pv2XotyK1SCaaW8GHYJaq6hkmUwTs" ], "script": "base64:BgKsAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBgoECAEIBBIECgIIARIFCgMIAQgSBgoEAQgIARIFCgMBCAgSDwoNCAgICAgICAgICAgICBIDCgEIEgMKAQgSBQoDCAgBEgYKBAgBCAgSBwoFCAgIAQQSBQoDCAQBEg4KDAgICAEBAQEBAQQECBIJCgcIAQEBAQEBEgASABIAEgASABIAEgASABIDCgEIEgMKAQibAQAEQ09ORgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIGY29uZmlnAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gABENQTU0CBGNwbW0ABEZMQVQCBGZsYXQAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAWa1VzZXJQb3NpdGlvbkluUE1hcmtldAIUX3VzZXJQb3NpdGlvblBNYXJrZXQACmtQb29sVG90YWwCCl9wb29sVG90YWwADmtQb29sVG90YWxMb2FuAg5fcG9vbFRvdGFsTG9hbgAQa1Bvb2xUb3RhbE1hcmtldAIQX3Bvb2xUb3RhbE1hcmtldAAUa1Bvb2xUb3RhbE1hcmtldExvYW4CFF9wb29sVG90YWxNYXJrZXRMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4AF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAhdfcG9vbEludGVyZXN0TWFya2V0TG9hbgAZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgIZX3Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAYa1Bvb2xBbGxvd2VkQm9ycm93QXNzZXRzAhhfcG9vbEFsbG93ZWRCb3Jyb3dBc3NldHMADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAMa1Bvb2xQTUFya2V0AhFfcG9vbFB1enpsZU1hcmtldAAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAJa1Bvb2xUeXBlAglfcG9vbFR5cGUACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCF19mYWxsYmFja0V4Y2hhbmdlU3dvcGZpAA5rUG9vbFByb3h5QWRkcgIRX3Bvb2xQcm94eUFkZHJlc3MACWtNb25leUJveAIOYXhseV9tb25leV9ib3gADmtTRkZhcm1pbmdBZGRyAhNzd29wZmlfZmFybWluZ19hZGRyAAxrTGVuZFNlcnZpY2UCEWxlbmRfc2VydmljZV9hZGRyAA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAC2tFeENvbnRyYWN0AhFleGNoYW5nZV9jb250cmFjdAAPa1d4U3dhcENvbnRyYWN0AhB3eF9zd2FwX2NvbnRyYWN0AAdrV3hSZXN0Agx3eF9yZXN0X2FkZHIAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAMa1BNYXJrZXRBZGRyAhVwdXp6bGVfbWFya2V0X2FkZHJlc3MAEGtQTWFya2V0UmVzdEFkZHICGnB1enpsZV9tYXJrZXRfcmVzdF9hZGRyZXNzAA9rR3JvdXAxQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAPa0dyb3VwMUFkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjNQSwIVZ3JvdXAxX2FkbWluM19wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGd3hSZXN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1d4UmVzdAISTm8gd3ggcmVzdCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFBWtXeElkAghObyB3eCBpZAALcE1hcmtldEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQxrUE1hcmtldEFkZHICGE5vIHB1enpsZSBtYXJrZXQgYWRkcmVzcwAPcE1hcmtldFJlc3RBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUQa1BNYXJrZXRSZXN0QWRkcgIdTm8gcHV6emxlIG1hcmtldCByZXN0IGFkZHJlc3MADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMUFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4zUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4zUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDGtMZW5kU2VydmljZQIbQ2FuJ3QgZ2V0IGxlbmQgc2VydmljZSBhZGRyAQ5pc09wZXJhdG9yQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBgkAAAIIBQFpBmNhbGxlcgUIbW9uZXlCb3gFBHVuaXQJAAIBAiRPbmx5IG9wZXJhdG9yIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BC2lzQWRtaW5DYWxsAQFpAwMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMVBLBgkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4yUEsFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzTGFuZENhbGwBAWkDCQAAAggFAWkGY2FsbGVyCQEOZ2V0TGVuZFNydkFkZHIABQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCGlzQWN0aXZlAAMJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGBgUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBEGlzQWN0aXZlRm9yVXNlcnMAAwMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYGBwUEdW5pdAkAAgECKURBcHAgaXMgaW5hY3RpdmUgZm9yIHVzZXJzIGF0IHRoaXMgbW9tZW50AQxpc1Bvb2xBY3RpdmUCBHBvb2wEdHlwZQQKV1hTRkFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHR5cGUFC2tBY3RpdmVTRldYBgQKcG9vbEFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgMDBQpXWFNGQWN0aXZlBQpwb29sQWN0aXZlBwYHAQ5hY2NvdW50QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA8AcCBQR0aGlzBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAAIBAgtNYXRjaCBlcnJvcgERZ2V0U0ZQb29sQmFsYW5jZXMBCHBvb2xBZGRyCQCUCgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEFBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEEgYXNzZXQgYmFsYW5jZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQkFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBiYWxhbmNlARFnZXRXWFBvb2xCYWxhbmNlcwMIcG9vbEFkZHIDYUlkA2JJZAkAlAoCCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNhSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYklkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBD2dldFBvb2xCYWxhbmNlcwQIcG9vbEFkZHIEdHlwZQNhSWQDYklkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAkBD3Vua25vd25Qb29sVHlwZQABDWdldFNGUG9vbERhdGEBCHBvb2xBZGRyBAskdDA5NzM5OTc4OAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgULJHQwOTczOTk3ODgFCyR0MDk3Mzk5Nzg4BARiYWxCCAULJHQwOTczOTk3ODgCXzIEBGJhbEEIBQskdDA5NzM5OTc4OAJfMQkAlwoFCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xBQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQkFzc2V0SWQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQFBGJhbEEFBGJhbEIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUOa1NGUG9vbFNoYXJlSWQCGENhbid0IGdldCBzaGFyZSBhc3NldCBpZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgENZ2V0V1hQb29sRGF0YQEIcG9vbEFkZHIEA2NmZwoAAUAJAPwHBAUIcG9vbEFkZHICHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNjZmcFA2NmZwQDYUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAEAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAQDYklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAFAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAQHc2hhcmVJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcAAwMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGkNhbid0IGdldCBwb29sIExQIGFzc2V0IGlkBA0kdDAxMDQ4NTEwNTQ0CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgUNJHQwMTA0ODUxMDU0NAUNJHQwMTA0ODUxMDU0NAQEYmFsQggFDSR0MDEwNDg1MTA1NDQCXzIEBGJhbEEIBQ0kdDAxMDQ4NTEwNTQ0Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTM1MzMxMzU5OAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMzUzMzEzNTk4Al8xBANiSWQIBQ0kdDAxMzUzMzEzNTk4Al8yBAhhQmFsYW5jZQgFDSR0MDEzNTMzMTM1OTgCXzMECGJCYWxhbmNlCAUNJHQwMTM1MzMxMzU5OAJfNAQGcHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQHZFByaWNlQQkAkQMCBQZwcmljZXMAAAQHZFByaWNlQgkAkQMCBQZwcmljZXMAAQQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkBANzdW0DAwkAZgIFB2RQcmljZUEAAAkAZgIFB2RQcmljZUIAAAcJAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgMJAGYCBQdkUHJpY2VBAAAJAGgCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24AAgMJAGYCBQdkUHJpY2VCAAAJAGgCCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24AAgD///////////8BAwkAZgIAAAUDc3VtAP///////////wEJAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQEOZ2V0U2hhcmVQcmljZXMBCHNoYXJlSWRzCgEJZ2V0UHJpY2VzAgFhB3NoYXJlSWQJAM0IAgUBYQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCgACJGwFCHNoYXJlSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEOZ2V0Q3Vyc0VudHJpZXMEA2FJZANiSWQHc2hhcmVJZAh3QW1vdW50cwQMYXNzZXRzUHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQKc2hhcmVQcmljZQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkBAZwcmljZXMJAM4IAgkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsBQh3QW1vdW50cwkAzAgCCQELU3RyaW5nRW50cnkCBQ9rVG9rZW5MYXN0UHJpY2UJALkJAgUGcHJpY2VzAgEsBQNuaWwBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFcFR5cGUIcG9vbEFkZHIETFBJZARwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCQCRAwIFBHJlcGwAAgoAAUAJAJEDAgUEcmVwbAAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTUzNTMxNTYxOQkAlAoCCQC1CQIKAAFACQD8BwQFBnd4UmVzdAIkcG9vbEV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwkAtQkCCgABQAkA/AcEBQZ3eFJlc3QCI3Bvb2xFdmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxNTM1MzE1NjE5BQ0kdDAxNTM1MzE1NjE5BApldmFsUHV0SW5CCAUNJHQwMTUzNTMxNTYxOQJfMgQKZXZhbFB1dEluQQgFDSR0MDE1MzUzMTU2MTkCXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUHCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGxwSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNhSWQFBHBtdEEJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2JJZAUEcG10QgUDbmlsBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwkAzAgCCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgIDcHV0CQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgIUd3hSZXBsZW5pc2hUd29Ub2tlbnMJAMwIAgkApQgBBQhwb29sQWRkcgkAzAgCBQRscElkCQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUFCHBvb2xBZGRyBXBUeXBlA3BtdAVwbXRJZARscElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmZjAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQlrUG9vbFR5cGUCBGNwbW0FBEZMQVQCC3B1dE9uZVRrblYyAglwdXRPbmVUa24DCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIcG9vbEFkZHIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICE3d4UmVwbGVuaXNoT25lVG9rZW4JAMwIAgkApQgBBQhwb29sQWRkcgkAzAgCBQRscElkCQDMCAIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABB3N0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQNc3Rha2VUb01hcmtldAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sUHJveHlBZGRyAgADBQ1zdGFrZVRvTWFya2V0CQD8BwQFC3BNYXJrZXRBZGRyAgZzdXBwbHkFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIZmFybUFkZHICBXN0YWtlBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgIJd3hTdGFrZUxwCQDMCAIJAKUIAQUIZmFybUFkZHIFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAAQl1bnN0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQKZnJvbU1hcmtldAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQNJHQwMTgzNTYxOTAzOAMFCmZyb21NYXJrZXQJAJUKAwULcE1hcmtldEFkZHICCHdpdGhkcmF3CQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAJUKAwkBEGdldFNGRmFybWluZ0FkZHIAAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAwkAAAIFCXByb3h5QWRkcgIACQCVCgMFCGZhcm1BZGRyAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAJUKAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAgt3eFVuc3Rha2VMcAkAzAgCCQClCAEFCGZhcm1BZGRyCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE4MzU2MTkwMzgCXzEEBWZOYW1lCAUNJHQwMTgzNTYxOTAzOAJfMgQGcGFyYW1zCAUNJHQwMTgzNTYxOTAzOAJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxOTQ2MDE5NzY2AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE5NDYwMTk3NjYCXzEECmFzc2V0VG9QYXkIBQ0kdDAxOTQ2MDE5NzY2Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAEQZ2V0V1hQb29sUmV2ZXJzZQMIcG9vbEFkZHIHYXNzZXRJbghhc3NldE91dAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDGxwTm9uUmV2ZXJzZQoAAUAJAPwHBAUJZkNvbnRyYWN0AiBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQkAzAgCBQdhc3NldEluCQDMCAIFCGFzc2V0T3V0BQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQECWxwUmV2ZXJzZQoAAUAJAPwHBAUJZkNvbnRyYWN0AiBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQkAzAgCBQhhc3NldE91dAkAzAgCBQdhc3NldEluBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQDCQECIT0CBQxscE5vblJldmVyc2UFBHVuaXQHAwkBAiE9AgUJbHBSZXZlcnNlBQR1bml0BgkAAgECEVBvb2wgaXMgbm90IGV4aXN0AQ1jYWxjRmxhdFRvUGF5BwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQHYXNzZXRJbgMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBQhhc3NldElkQgUIYXNzZXRJZEEECGFtb3V0R2V0CgABQAkA/AcEBQ53eFN3YXBDb250cmFjdAIVc3dhcENhbGN1bGF0ZVJFQURPTkxZCQDMCAIFEGFtb3VudFRva2VuVG9HZXQJAMwIAgUHYXNzZXRJbgkAzAgCBQ9hc3NldFRva2VuVG9HZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQhhbW91dEdldAUIYW1vdXRHZXQDCQAAAgUIYW1vdXRHZXQFEGFtb3VudFRva2VuVG9HZXQJAJQKAgUHYXNzZXRJbgUQYW1vdW50VG9rZW5Ub0dldAQOYW1vdW50VG9QYXlNYXgDCQBmAgUQYW1vdW50VG9rZW5Ub0dldAUIYW1vdXRHZXQJAGsDBRBhbW91bnRUb2tlblRvR2V0AG4AZAkAawMFEGFtb3VudFRva2VuVG9HZXQAWgBkBAxhbW91bnRHZXRNYXgKAAFACQD8BwQFDnd4U3dhcENvbnRyYWN0AhVzd2FwQ2FsY3VsYXRlUkVBRE9OTFkJAMwIAgUOYW1vdW50VG9QYXlNYXgJAMwIAgUHYXNzZXRJbgkAzAgCBQ9hc3NldFRva2VuVG9HZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQxhbW91bnRHZXRNYXgFDGFtb3VudEdldE1heAoBA2hkbQIBYQVpbmRleAQNJHQwMjE3MjEyMTc0MgUBYQQDcGF5CAUNJHQwMjE3MjEyMTc0MgJfMQQGcGF5TWF4CAUNJHQwMjE3MjEyMTc0MgJfMgQHcGF5TmV4dAkAaQIJAGQCBQNwYXkFBnBheU1heAACBA1hbW91bnRHZXROZXh0CgABQAkA/AcEBQ53eFN3YXBDb250cmFjdAIVc3dhcENhbGN1bGF0ZVJFQURPTkxZCQDMCAIFB3BheU5leHQJAMwIAgUHYXNzZXRJbgkAzAgCBQ9hc3NldFRva2VuVG9HZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQ1hbW91bnRHZXROZXh0BQ1hbW91bnRHZXROZXh0AwkAZgIFEGFtb3VudFRva2VuVG9HZXQFDWFtb3VudEdldE5leHQJAJQKAgUHcGF5TmV4dAUGcGF5TWF4CQCUCgIFA3BheQUHcGF5TmV4dAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQMcmVzQW1udFRvUGF5CgACJGwJAMwIAgABCQDMCAIAAgUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBRBhbW91bnRUb2tlblRvR2V0BQ5hbW91bnRUb1BheU1heAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDaGRtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgQLYW1vdW50VG9QYXkDCQBmAgUQYW1vdW50VG9rZW5Ub0dldAUIYW1vdXRHZXQIBQxyZXNBbW50VG9QYXkCXzIIBQxyZXNBbW50VG9QYXkCXzEJAJQKAgUHYXNzZXRJbgULYW1vdW50VG9QYXkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEWNhbGNBbW91bnRUb1BheVdYBwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQNJHQwMjIzNDAyMjM3OQkBDWdldFdYU3dhcEZlZXMBBQRwb29sBARwRmVlCAUNJHQwMjIzNDAyMjM3OQJfMQQFcHJGZWUIBQ0kdDAyMjM0MDIyMzc5Al8yBAhwb29sVHlwZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFCWtQb29sVHlwZQUEQ1BNTQQIZmVlU2NhbGUJALYCAQCAwtcvAwkAAAIFCHBvb2xUeXBlBQRGTEFUCQENY2FsY0ZsYXRUb1BheQcFBHBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUEYmFsQQUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BA0kdDAyMjYxMjIyOTIwAwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQgkAZQIFBGJhbEEFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEEJAGUCBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAyMjYxMjIyOTIwAl8xBAphc3NldFRvUGF5CAUNJHQwMjI2MTIyMjkyMAJfMgQSYW1vdW50VG9QYXlXaXRoRmVlCQCgAwEJAL0CBAkAtgIBBQthbW91bnRUb1BheQUIZmVlU2NhbGUJALgCAgUIZmVlU2NhbGUJALYCAQkAZAIFBXByRmVlBQRwRmVlBQdDRUlMSU5HCQCUCgIFCmFzc2V0VG9QYXkFEmFtb3VudFRvUGF5V2l0aEZlZQEQZXhjaGFuZ2VEaXJlY3RseQgFcFR5cGUEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgADAwkAAAIFBXBUeXBlBQdTRl9QT09MBgkBAiE9AgUGcG9vbEZCAgAEDSR0MDIzMzYxMjM1NzMDCQAAAgUGcG9vbEZCAgAJAJUKAwUEYmFsQQUEYmFsQgUEcG9vbAQNJHQwMjM0NjcyMzU0MAkBEWdldFNGUG9vbEJhbGFuY2VzAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcG9vbEZCBAZzZkJhbEEIBQ0kdDAyMzQ2NzIzNTQwAl8xBAZzZkJhbEIIBQ0kdDAyMzQ2NzIzNTQwAl8yCQCVCgMFBnNmQmFsQQUGc2ZCYWxCBQZwb29sRkIEBXBCYWxBCAUNJHQwMjMzNjEyMzU3MwJfMQQFcEJhbEIIBQ0kdDAyMzM2MTIzNTczAl8yBAZleFBvb2wIBQ0kdDAyMzM2MTIzNTczAl8zBA0kdDAyMzU3ODIzNzA0CQERY2FsY0Ftb3VudFRvUGF5U0YHBQZleFBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUFcEJhbEEFBXBCYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAyMzU3ODIzNzA0Al8xBAthbW91bnRUb1BheQgFDSR0MDIzNTc4MjM3MDQCXzIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtb3VudFRva2VuVG9HZXQFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAyMzkwNjI0MDI4CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDIzOTA2MjQwMjgCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMjM5MDYyNDAyOAJfMgkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCBRBhbW91bnRUb2tlblRvR2V0CQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAkBD3Vua25vd25Qb29sVHlwZQABFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFcFR5cGUEcG9vbA1hbW91bnRUb2tlbkV4DmFzc2V0VG9rZW5Ub0V4D2Fzc2V0VG9rZW5Ub0dldAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQ9hc3NldFRva2VuVG9HZXQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgAEA2ludgMDCQAAAgUFcFR5cGUFB1NGX1BPT0wGCQECIT0CBQZwb29sRkICAAQGZXhQb29sAwkAAAIFBnBvb2xGQgIABQRwb29sBQZwb29sRkIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCAgExBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUOYXNzZXRUb2tlblRvRXgFDWFtb3VudFRva2VuRXgFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCAAEJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQ5hc3NldFRva2VuVG9FeAUNYW1vdW50VG9rZW5FeAUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFD2Fzc2V0VG9rZW5Ub0dldAMJAAACBQhiYWxBZnRlcgUIYmFsQWZ0ZXIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDI1MTU3MjU2MjgDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUGd3hSZXN0Ahdwb29sRXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAyNTE1NzI1NjI4Al8xBAdhbW91bnRCCAUNJHQwMjUxNTcyNTYyOAJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDI2MDY4MjYxNDcJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjYwNjgyNjE0NwJfMQQDYklkCAUNJHQwMjYwNjgyNjE0NwJfMgQEYUJhbAgFDSR0MDI2MDY4MjYxNDcCXzMEBGJCYWwIBQ0kdDAyNjA2ODI2MTQ3Al80BARscElkCAUNJHQwMjYwNjgyNjE0NwJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBAhmYXJtQWRkcgkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBANpbnYDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIZmFybUFkZHICB2NsYWltV3gJAMwIAgUEbHBJZAUDbmlsBQNuaWwJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAg13eENsYWltRmFybWVkCQDMCAIJAKUIAQUIZmFybUFkZHIJAMwIAgUEbHBJZAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQRXWElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEPcmVwbGVuaXNoQnlUeXBlCwVwVHlwZQRwb29sB2ZlZVR5cGUEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCBExQSWQLc3Rha2VNYXJrZXQED2xwQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkAwkAAAIFD2xwQmFsYW5jZUJlZm9yZQUPbHBCYWxhbmNlQmVmb3JlBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQNJHQwMjY5NTIyNzM4MAMDCQBmAgUEcG10QQAACQBmAgUEcG10QgAABwQNJHQwMjcwMTgyNzE0MAkBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFBXBUeXBlBQhwb29sQWRkcgUETFBJZAUEcG10QQUDYUlkBQRwbXRCBQNiSWQFBGJhbEEFBGJhbEIEBnBtdEluQQgFDSR0MDI3MDE4MjcxNDACXzEEBnBtdEluQggFDSR0MDI3MDE4MjcxNDACXzIEBmNoYW5nZQgFDSR0MDI3MDE4MjcxNDACXzMECGNoYW5nZUlkCAUNJHQwMjcwMTgyNzE0MAJfNAQDaW52CQEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBwUIcG9vbEFkZHIFBXBUeXBlBQZwbXRJbkEFA2FJZAUGcG10SW5CBQNiSWQFBExQSWQDCQAAAgUDaW52BQNpbnYJAJQKAgUGY2hhbmdlBQhjaGFuZ2VJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAGYCBQRwbXRBAAAJAJQKAgUEcG10QQUDYUlkAwkAZgIFBHBtdEIAAAkAlAoCBQRwbXRCBQNiSWQJAAIBAhBwbXRzIG11c3QgYmUgPiAwBAZjaGFuZ2UIBQ0kdDAyNjk1MjI3MzgwAl8xBAhjaGFuZ2VJZAgFDSR0MDI2OTUyMjczODACXzIEA2ludgMJAGYCBQZjaGFuZ2UAAAkBF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBQUIcG9vbEFkZHIFBXBUeXBlBQZjaGFuZ2UFCGNoYW5nZUlkBQRMUElkBQNuaWwDCQAAAgUDaW52BQNpbnYEDmxwQmFsYW5jZUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQEC3RvdGFsU3Rha2VkCQBlAgUObHBCYWxhbmNlQWZ0ZXIFD2xwQmFsYW5jZUJlZm9yZQQNYXhseUZlZUFtb3VudAkAawMFC3RvdGFsU3Rha2VkCQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYEEXVzZXJTaGFyZUZvclN0YWtlCQBlAgULdG90YWxTdGFrZWQFDWF4bHlGZWVBbW91bnQDCQBnAgAABRF1c2VyU2hhcmVGb3JTdGFrZQkAAgECKGFtb3VudCBvZiBzdGFrZWQgc2hhcmV0b2tlbnMgbXVzdCBiZSA+IDAEBWludkxQCQEHc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQRMUElkBRF1c2VyU2hhcmVGb3JTdGFrZQULc3Rha2VNYXJrZXQDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCQRwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbg1zdGFrZVRvTWFya2V0BAt0b3RhbEFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQPdG90YWxBbW91bnRMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsQW1vdW50TWFya2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBV0b3RhbEFtb3VudE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAABBJwb29sSW50ZXJlc3ROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAEEHBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAAAEFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAABA0kdDAyODg0MTI5NjY2AwUId2l0aExvYW4DBQ1zdGFrZVRvTWFya2V0CQCUCgIFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsQW1vdW50TWFya2V0BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGQCBRV0b3RhbEFtb3VudE1hcmtldExvYW4FDHN0YWtlZEFtb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BgUDbmlsCQCUCgIFEHBvb2xJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBQ90b3RhbEFtb3VudExvYW4FDHN0YWtlZEFtb3VudAUDbmlsAwUNc3Rha2VUb01hcmtldAkAlAoCBRhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsQW1vdW50TWFya2V0BQxzdGFrZWRBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAYFA25pbAkAlAoCBRJwb29sSW50ZXJlc3ROb0xvYW4FA25pbAQPY3VyUG9vbEludGVyZXN0CAUNJHQwMjg4NDEyOTY2NgJfMQQHYWRFbnRyeQgFDSR0MDI4ODQxMjk2NjYCXzIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwFB2FkRW50cnkBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQkEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50A0FJZANCSWQEYmFsQQRiYWxCB3NoYXJlSWQDAwkBAiE9AgUHdG9rZW5JZAUDQUlkCQECIT0CBQd0b2tlbklkBQNCSWQHCQACAQILV3JvbmcgYXNzZXQEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wDCQAAAgUQdG90YWxTaGFyZUFtb3VudAAACQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAAABBh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAADCQBmAgAACQBlAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFEXRvdGFsTWFya2V0QW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JAAIBAkNFcnJvciB3aXRoIHNoYXJlIGFtb3VudCB0b3RhbFNoYXJlQW1vdW50IDwgdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBAtsb2FuUGVyY2VudAkAawMFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUGU0NBTEU4CQBlAgUQdG90YWxTaGFyZUFtb3VudAURdG90YWxNYXJrZXRBbW91bnQEEHRva2Vuc0ZvckZlZUxvYW4JAGsDBQt0b2tlbkFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQSdG9rZW5zRm9yRmVlTm9Mb2FuCQBlAgULdG9rZW5BbW91bnQFEHRva2Vuc0ZvckZlZUxvYW4EC2F4bHlGZWVMb2FuCQBrAwUQdG9rZW5zRm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlGZWVOb0xvYW4JAGsDBRJ0b2tlbnNGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BAdheGx5RmVlCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4EDSR0MDMyNzQ0MzI4NDQDCQAAAgUHdG9rZW5JZAUDQUlkCQCUCgIJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQAACQCUCgIAAAkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlBARwbXRBCAUNJHQwMzI3NDQzMjg0NAJfMQQEcG10QggFDSR0MDMyNzQ0MzI4NDQCXzIEDSR0MDMyODQ3MzI5NTgJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAcEDHN0YWtlZEFtb3VudAgFDSR0MDMyODQ3MzI5NTgCXzEEAm5mCAUNJHQwMzI4NDczMjk1OAJfMgQTY3VyUG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQKc3Rha2VkTG9hbgkAawMFDHN0YWtlZEFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQMc3Rha2VkTm9Mb2FuCQBlAgUMc3Rha2VkQW1vdW50BQpzdGFrZWRMb2FuBA9uZXdJbnRlcmVzdExvYW4DCQBmAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRNjdXJQb29sSW50ZXJlc3RMb2FuCQBrAwUKc3Rha2VkTG9hbgUHU0NBTEUxMAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAEEW5ld0ludGVyZXN0Tm9Mb2FuAwkAZgIJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkAawMFDHN0YWtlZE5vTG9hbgUHU0NBTEUxMAkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4FD25ld0ludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuBRFuZXdJbnRlcmVzdE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUKc3Rha2VkTG9hbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUHYXhseUZlZQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5JZAUDbmlsBQxzdGFrZWRBbW91bnQBFmNhcGl0YWxpemVQdXp6bGVNYXJrZXQDBHBvb2wFcFR5cGUHc2hhcmVJZAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQNbWFya2V0QmFsYW5jZQkA8AcCBQtwTWFya2V0QWRkcgkA2QQBBQdzaGFyZUlkAwkAAAIFDW1hcmtldEJhbGFuY2UFDW1hcmtldEJhbGFuY2UED21hcmtldEF2YWlsYWJsZQoAAUAJAPwHBAUPcE1hcmtldFJlc3RBZGRyAhxhc3NldFN1cHBseUJ5QWRkcmVzc1JFQURPTkxZCQDMCAIJAKUIAQULcE1hcmtldEFkZHIJAMwIAgUHc2hhcmVJZAkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQ9tYXJrZXRBdmFpbGFibGUFD21hcmtldEF2YWlsYWJsZQQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAAAwMJAAACBRF0b3RhbE1hcmtldEFtb3VudAAACQBmAgUPbWFya2V0QXZhaWxhYmxlAAAHBA51bnN0YWtlZEFtb3VudAkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ9tYXJrZXRBdmFpbGFibGUGAwkAAAIFDnVuc3Rha2VkQW1vdW50BQ51bnN0YWtlZEFtb3VudAMJAGYCBQ1tYXJrZXRCYWxhbmNlBQ51bnN0YWtlZEFtb3VudAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ51bnN0YWtlZEFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwAAAkAlAoCBQNuaWwAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQJY2FwQW1vdW50CQBlAgUPbWFya2V0QXZhaWxhYmxlBRF0b3RhbE1hcmtldEFtb3VudAMJAGcCAAAFCWNhcEFtb3VudAkAlAoCBQNuaWwAAAQRbWFya2V0TG9hblBlcmNlbnQJAGsDBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQZTQ0FMRTgFEXRvdGFsTWFya2V0QW1vdW50BBZ0b2tlbnNNYXJrZXRGb3JGZWVMb2FuCQBrAwUJY2FwQW1vdW50BRFtYXJrZXRMb2FuUGVyY2VudAUGU0NBTEU4BBt0b2tlbnNNYXJrZXRGb3JGb3JGZWVOb0xvYW4JAGUCBQljYXBBbW91bnQFFnRva2Vuc01hcmtldEZvckZlZUxvYW4EEWF4bHlNYXJrZXRGZWVMb2FuCQBrAwUWdG9rZW5zTWFya2V0Rm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEE2F4bHlNYXJrZXRGZWVOb0xvYW4JAGsDBRt0b2tlbnNNYXJrZXRGb3JGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BA1heGx5TWFya2V0RmVlCQBkAgURYXhseU1hcmtldEZlZUxvYW4FE2F4bHlNYXJrZXRGZWVOb0xvYW4DCQBmAgUNYXhseU1hcmtldEZlZQUNbWFya2V0QmFsYW5jZQkAlAoCBQNuaWwAAAQSc3Rha2VkTWFya2V0QW1vdW50CQBlAgUJY2FwQW1vdW50BQ1heGx5TWFya2V0RmVlBBBzdGFrZWRNYXJrZXRMb2FuCQBrAwUSc3Rha2VkTWFya2V0QW1vdW50BRFtYXJrZXRMb2FuUGVyY2VudAUGU0NBTEU4BBJzdGFrZWRNYXJrZXROb0xvYW4JAGUCBRJzdGFrZWRNYXJrZXRBbW91bnQFEHN0YWtlZE1hcmtldExvYW4EGWN1clBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAABBtjdXJQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAAAEFW5ld0ludGVyZXN0TWFya2V0TG9hbgMJAGYCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAJAGQCBRljdXJQb29sSW50ZXJlc3RNYXJrZXRMb2FuCQBrAwUQc3Rha2VkTWFya2V0TG9hbgUHU0NBTEUxMAUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgAABBduZXdJbnRlcmVzdE1hcmtldE5vTG9hbgMJAGYCCQBlAgURdG90YWxNYXJrZXRBbW91bnQFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAkAZAIFG2N1clBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkAawMFEnN0YWtlZE1hcmtldE5vTG9hbgUHU0NBTEUxMAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAEDnVuc3Rha2VkQW1vdW50CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFDWF4bHlNYXJrZXRGZWUGAwkAAAIFDnVuc3Rha2VkQW1vdW50BQ51bnN0YWtlZEFtb3VudAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuBRVuZXdJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgUXbmV3SW50ZXJlc3RNYXJrZXROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsTWFya2V0QW1vdW50BRJzdGFrZWRNYXJrZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGQCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBRBzdGFrZWRNYXJrZXRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ1heGx5TWFya2V0RmVlCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQNuaWwFEnN0YWtlZE1hcmtldEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQLaXNNYXJrZXRQb3MEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEEnBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQQcG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEGHBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQWcG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkAwULaXNNYXJrZXRQb3MFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4FEHBvb2xJbnRlcmVzdExvYW4DBQtpc01hcmtldFBvcwUYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuBRJwb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgUEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzDXdpdGhkcmF3VG9rZW4EB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24ECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQKaXNCb3Jyb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAAAAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBXBvc0lkBQppc0JvcnJvd2VkBQpmcm9tTWFya2V0BA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsTWFya2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4AAAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAzOTAxMjM5MDg0CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDM5MDEyMzkwODQCXzEEBmlkQlN0cggFDSR0MDM5MDEyMzkwODQCXzIEBGJhbEEIBQ0kdDAzOTAxMjM5MDg0Al8zBARiYWxCCAUNJHQwMzkwMTIzOTA4NAJfNAQHc2hhcmVJZAgFDSR0MDM5MDEyMzkwODQCXzUEDSR0MDM5MDg3MzkxNTQJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDM5MDg3MzkxNTQCXzEEA2lkQggFDSR0MDM5MDg3MzkxNTQCXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQUKZnJvbU1hcmtldAMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBCQBlAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQJAGQCBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlBQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52AwkAAAIFCXByb3h5QWRkcgIACQD8BwQFCHBvb2xBZGRyAgNnZXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAhN3eFdpdGhkcmF3VHdvVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGaWRBU3RyCQDMCAIFBmlkQlN0cgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQADCQAAAgUDaW52BQNpbnYECmNCYWxBQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQpjQmFsQUFmdGVyBQpjQmFsQUFmdGVyBApjQmFsQkFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUKY0JhbEJBZnRlcgUKY0JhbEJBZnRlcgQNJHQwNDAxNjI0MDI1MQkAlAoCCQBlAgUKY0JhbEFBZnRlcgULY0JhbEFCZWZvcmUJAGUCBQpjQmFsQkFmdGVyBQtjQmFsQkJlZm9yZQQNdG9rZW5zQW1vdW50QQgFDSR0MDQwMTYyNDAyNTECXzEEDXRva2Vuc0Ftb3VudEIIBQ0kdDA0MDE2MjQwMjUxAl8yBA0kdDA0MDI1NDQxNDk5AwUKaXNCb3Jyb3dlZAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkCQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEC2Nsb3NlRGJ0SW52AwkAZgIFBGRlYnQAAAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAghyZXBheUZvcgkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgUHc2hhcmVJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDA0MDI1NDQxNDk5Al8xBAd0b1VzZXJCCAUNJHQwNDAyNTQ0MTQ5OQJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBBZwb29sVG90YWxNYXJrZXRFbnRyaWVzAwUKZnJvbU1hcmtldAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQJAGUCBRF0b3RhbE1hcmtldEFtb3VudAUPdXNlckNhbldpdGhkcmF3BQNuaWwDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuCQBlAgUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsBA0kdDA0MTkxMjQyMzA3AwMJAAACBQ13aXRoZHJhd1Rva2VuBQZpZEFTdHIJAGYCBQd0b1VzZXJCAAAHBAZhbXRHZXQJARVleGNoYW5nZURpcmVjdGx5Tm9MaW0FBQVwVHlwZQUEcG9vbAUHdG9Vc2VyQgUGaWRCU3RyBQZpZEFTdHIDCQAAAgUGYW10R2V0BQZhbXRHZXQJAJQKAgkAZAIFB3RvVXNlckEFBmFtdEdldAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwMJAAACBQ13aXRoZHJhd1Rva2VuBQZpZEJTdHIJAGYCBQd0b1VzZXJBAAAHBAZhbXRHZXQJARVleGNoYW5nZURpcmVjdGx5Tm9MaW0FBQVwVHlwZQUEcG9vbAUHdG9Vc2VyQQUGaWRBU3RyBQZpZEJTdHIDCQAAAgUGYW10R2V0BQZhbXRHZXQJAJQKAgAACQBkAgUHdG9Vc2VyQgUGYW10R2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFB3RvVXNlckEFB3RvVXNlckIEC3RvVXNlckFDYWxjCAUNJHQwNDE5MTI0MjMwNwJfMQQLdG9Vc2VyQkNhbGMIBQ0kdDA0MTkxMjQyMzA3Al8yBAdlbnRyaWVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFC3RvVXNlckFDYWxjBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFC3RvVXNlckJDYWxjBQNpZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3N0b3BMb3NzRmVlCQDZBAEFB3NoYXJlSWQFA25pbAUUcG9vbFRvdGFsTG9hbkVudHJpZXMFFnBvb2xUb3RhbE1hcmtldEVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwJAJQKAgUHZW50cmllcwkAzAgCBQt0b1VzZXJBQ2FsYwkAzAgCBQt0b1VzZXJCQ2FsYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxsaXF1aWRhdGVQb3MEBmNhbGxlcgR1c2VyBXBvc0lkB2xBbW91bnQEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AhxUaGVyZSBhcmUgbm8gYm9ycm93IHBvc2l0aW9uBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBXBvc0lkBgUKZnJvbU1hcmtldAQOcG9vbFRvdGFsU2hhcmUJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEEnBvb2xUb3RhbFNoYXJlTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAAECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNDQyMzI0NDMwNAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDA0NDIzMjQ0MzA0Al8xBAZpZEJTdHIIBQ0kdDA0NDIzMjQ0MzA0Al8yBARiYWxBCAUNJHQwNDQyMzI0NDMwNAJfMwQEYmFsQggFDSR0MDQ0MjMyNDQzMDQCXzQEB3NoYXJlSWQIBQ0kdDA0NDIzMjQ0MzA0Al81BA0kdDA0NDMwNzQ0Mzc0CQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDA0NDMwNzQ0Mzc0Al8xBANpZEIIBQ0kdDA0NDMwNzQ0Mzc0Al8yBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEEHBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUKZnJvbU1hcmtldAMJAAACBQNpbnYFA2ludgMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgITd3hXaXRoZHJhd1R3b1Rva2VucwkAzAgCBQRwb29sCQDMCAIFBmlkQVN0cgkAzAgCBQZpZEJTdHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAwkAAAIFA2ludgUDaW52BApjQmFsQUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgUKY0JhbEFBZnRlcgUKY0JhbEFBZnRlcgQKY0JhbEJBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFCmNCYWxCQWZ0ZXIFCmNCYWxCQWZ0ZXIEDSR0MDQ1NTU4NDU2NDcJAJQKAgkAZQIFCmNCYWxBQWZ0ZXIFC2NCYWxBQmVmb3JlCQBlAgUKY0JhbEJBZnRlcgULY0JhbEJCZWZvcmUEDXRva2Vuc0Ftb3VudEEIBQ0kdDA0NTU1ODQ1NjQ3Al8xBA10b2tlbnNBbW91bnRCCAUNJHQwNDU1NTg0NTY0NwJfMgQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFB2xBbW91bnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFB2xBbW91bnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEDSR0MDQ2MTUzNDYzODADCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAlAoCCQBlAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUFB2xBbW91bnQJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlCQCUCgIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlCQBlAgkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUFB2xBbW91bnQEB3RvVXNlckEIBQ0kdDA0NjE1MzQ2MzgwAl8xBAd0b1VzZXJCCAUNJHQwNDYxNTM0NjM4MAJfMgQNJHQwNDYzODM0NjQ2MAkBD2dldFBvb2xCYWxhbmNlcwQFCHBvb2xBZGRyBQVwVHlwZQUGaWRBU3RyBQZpZEJTdHIECWJhbEFBZnRlcggFDSR0MDQ2MzgzNDY0NjACXzEECWJhbEJBZnRlcggFDSR0MDQ2MzgzNDY0NjACXzIEDSR0MDQ2NDYzNDY1OTQJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQd0b1VzZXJBBQZpZEFTdHIFB3RvVXNlckIFBmlkQlN0cgUEYmFsQQUEYmFsQgUHc2hhcmVJZAUKZnJvbU1hcmtldAQKdXNlclN0YWtlZAgFDSR0MDQ2NDYzNDY1OTQCXzEEB2F4bHlGZWUIBQ0kdDA0NjQ2MzQ2NTk0Al8yBA91c2VyTHBMaXF1ZGF0ZWQJAGUCBQ91c2VyQ2FuV2l0aGRyYXcFCnVzZXJTdGFrZWQEDSR0MDQ2NjUzNDY5OTgDBQpmcm9tTWFya2V0CQCUCgIFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGUCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQ91c2VyTHBMaXF1ZGF0ZWQFA25pbAkAlAoCBRBwb29sSW50ZXJlc3RMb2FuBQNuaWwED2N1clBvb2xJbnRlcmVzdAgFDSR0MDQ2NjUzNDY5OTgCXzEEFnBvb2xUb3RhbE1hcmtldEVudHJpZXMIBQ0kdDA0NjY1MzQ2OTk4Al8yCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckxwTGlxdWRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAZQIFB3BBbW91bnQFD3VzZXJMcExpcXVkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QFD2N1clBvb2xJbnRlcmVzdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB2xBbW91bnQJAQ5hc3NldElkRnJvbVN0cgEFC2JvcnJvd0Fzc2V0BQNuaWwFFnBvb2xUb3RhbE1hcmtldEVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwFD3VzZXJMcExpcXVkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKBA1zdGFrZVRvTWFya2V0CQAAAgkAkQMCBQdyZXF1ZXN0AAsCBHRydWUJAJ4KDAUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50BQ1zdGFrZVRvTWFya2V0ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDA0ODcyNjQ4ODIzAwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDA0ODcyNjQ4ODIzAl8xBAtib3Jyb3dEZWNQcggFDSR0MDQ4NzI2NDg4MjMCXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbRBhbW91bnRUb0V4Y2hhbmdlEWFtb3VudEZyb21CYWxhbmNlBA0kdDA0OTg0NDUwNjk1AwUFY2xhaW0EB2NsYWltZWQJAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sAwkAZgIFEGFtb3VudFRvRXhjaGFuZ2UAAAkAlAoCBRBhbW91bnRUb0V4Y2hhbmdlCAUHY2xhaW1lZAJfMgkAlAoCCQBkAggFB2NsYWltZWQCXzEFEWFtb3VudEZyb21CYWxhbmNlCAUHY2xhaW1lZAJfMgQMY2xhaW1lZEFzc2V0AwkAAAIFBXBUeXBlBQdTRl9QT09MBQZTV09QSUQDCQAAAgUFcFR5cGUFB1dYX1BPT0wEDHByb3h5QWRkclN0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sUHJveHlBZGRyAgAEA2ludgMJAQIhPQIFDHByb3h5QWRkclN0cgIABAlwcm94eUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDHByb3h5QWRkclN0cgQMcHJveHlCYWxhbmNlCQDwBwIFCXByb3h5QWRkcgUEV1hJRAMJAGYCBQxwcm94eUJhbGFuY2UAAAkA/AcEBQlwcm94eUFkZHICEHd4Q2xhaW1GaW5hbGl6ZWQJAMwIAgUMcHJveHlCYWxhbmNlBQNuaWwFA25pbAUEdW5pdAUEdW5pdAMJAAACBQNpbnYFA2ludgUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAJAJQKAgkAZAIFEGFtb3VudFRvRXhjaGFuZ2UFEWFtb3VudEZyb21CYWxhbmNlBQxjbGFpbWVkQXNzZXQDCQAAAgUNJHQwNDk4NDQ1MDY5NQUNJHQwNDk4NDQ1MDY5NQQFYXNzZXQIBQ0kdDA0OTg0NDUwNjk1Al8yBAZhbW91bnQIBQ0kdDA0OTg0NDUwNjk1Al8xBANiYWwJAQ5hY2NvdW50QmFsYW5jZQEFBWFzc2V0AwkAAAIFA2JhbAUDYmFsAwkAZgIFBmFtb3VudAUDYmFsCQACAQIZVG8gYmlnIGFtb3VudCB0byBleGNoYW5nZQkAlAoCBQZhbW91bnQFBWFzc2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuHAFpARNnZXRQb29sSW5mb1JFQURPTkxZAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDUxMDQ3NTExMzcJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNTEwNDc1MTEzNwJfMQQDQklkCAUNJHQwNTEwNDc1MTEzNwJfMgQEYmFsQQgFDSR0MDUxMDQ3NTExMzcCXzMEBGJhbEIIBQ0kdDA1MTA0NzUxMTM3Al80BAdzaGFyZUlkCAUNJHQwNTEwNDc1MTEzNwJfNQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAkAlAoCBQNuaWwJAJgKBgUDQUlkBQNCSWQFB3NoYXJlSWQFBGJhbEEFBGJhbEIFC3NoYXJlU3VwcGx5AWkBGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZAQdzaGFyZUlkBAtzaGFyZVByaWNlcwkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCQCUCgIFA25pbAULc2hhcmVQcmljZXMBaQEiZ2V0VXNlclBvc2l0aW9uU2hhcmVBbW91bnRSRUFET05MWQIEdXNlcgZwb3NOdW0EBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sAhBVbmtub3duIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBQR1c2VyBQRwb29sBQZwb3NOdW0JAGYCBQxib3Jyb3dBbW91bnQAAAUKZnJvbU1hcmtldAkAlAoCBQNuaWwFD3VzZXJDYW5XaXRoZHJhdwFpARdnZXRVc2VyUG9zaXRpb25SRUFET05MWQMEdXNlcgVwb29scwZwb3NOdW0KAQd1c2VyUG9zAgFhBHBvb2wEDSR0MDUyMTM1NTIyMDUFAWEECXdBbW91bnRzQQgFDSR0MDUyMTM1NTIyMDUCXzEECXdBbW91bnRzQggFDSR0MDUyMTM1NTIyMDUCXzIEBWRlYnRzCAUNJHQwNTIxMzU1MjIwNQJfMwQLZXFXQW1vdW50c0EIBQ0kdDA1MjEzNTUyMjA1Al80BAtlcVdBbW91bnRzQggFDSR0MDUyMTM1NTIyMDUCXzUEBWluZGV4CAUNJHQwNTIxMzU1MjIwNQJfNgMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUNa1VzZXJQb3NpdGlvbgkAmAoGCQDNCAIFCXdBbW91bnRzQQAACQDNCAIFCXdBbW91bnRzQgAACQDNCAIFBWRlYnRzAAAJAM0IAgULZXFXQW1vdW50c0EAAAkAzQgCBQtlcVdBbW91bnRzQgAACQBkAgUFaW5kZXgAAQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDUyNDg0NTI1NzQJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNTI0ODQ1MjU3NAJfMQQDQklkCAUNJHQwNTI0ODQ1MjU3NAJfMgQEYmFsQQgFDSR0MDUyNDg0NTI1NzQCXzMEBGJhbEIIBQ0kdDA1MjQ4NDUyNTc0Al80BAdzaGFyZUlkCAUNJHQwNTI0ODQ1MjU3NAJfNQQMYm9ycm93QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEWtVc2VyQm9ycm93QW1vdW50AAAECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wJAJEDAgUGcG9zTnVtBQVpbmRleAkAZgIFDGJvcnJvd0Ftb3VudAAABQpmcm9tTWFya2V0BA0kdDA1MjkyNDUzMDQ0CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwQId0Ftb3VudEEIBQ0kdDA1MjkyNDUzMDQ0Al8xBAh3QW1vdW50QggFDSR0MDUyOTI0NTMwNDQCXzIDCQBmAgUMYm9ycm93QW1vdW50AAAEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4CQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAZgIFBGRlYnQFCHdBbW91bnRBBwkAZQIFBGRlYnQFCHdBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUDQklkCQBmAgUEZGVidAUId0Ftb3VudEIHCQBlAgUEZGVidAUId0Ftb3VudEIAAAQLYW1vdW50VG9QYXkDCQBmAgUNYW1vdW50VG9HZXRFeAAAAwkAAAIFBXBUeXBlBQdTRl9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVNGBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgkBD3Vua25vd25Qb29sVHlwZQAAAAQNJHQwNTM5NTY1NDE3NQMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQCUCgIJAGUCCQBkAgUId0Ftb3VudEEFDWFtb3VudFRvR2V0RXgFBGRlYnQJAGUCBQh3QW1vdW50QgULYW1vdW50VG9QYXkJAJQKAgkAZQIFCHdBbW91bnRBBQthbW91bnRUb1BheQkAZQIJAGQCBQh3QW1vdW50QgUNYW1vdW50VG9HZXRFeAUEZGVidAQKZXFXQW1vdW50QQgFDSR0MDUzOTU2NTQxNzUCXzEECmVxV0Ftb3VudEIIBQ0kdDA1Mzk1NjU0MTc1Al8yCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQDNCAIFBWRlYnRzBQRkZWJ0CQDNCAIFC2VxV0Ftb3VudHNBBQplcVdBbW91bnRBCQDNCAIFC2VxV0Ftb3VudHNCBQplcVdBbW91bnRCCQBkAgUFaW5kZXgAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgUFZGVidHMJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQBkAgUFaW5kZXgAAQQNJHQwNTQ0MzA1NDU0MQoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJgKBgUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHdXNlclBvcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAl3QW1vdW50c0EIBQ0kdDA1NDQzMDU0NTQxAl8xBAl3QW1vdW50c0IIBQ0kdDA1NDQzMDU0NTQxAl8yBAVkZWJ0cwgFDSR0MDU0NDMwNTQ1NDECXzMEC2VxV0Ftb3VudHNBCAUNJHQwNTQ0MzA1NDU0MQJfNAQLZXFXQW1vdW50c0IIBQ0kdDA1NDQzMDU0NTQxAl81CQCUCgIFA25pbAkAlwoFBQl3QW1vdW50c0EFCXdBbW91bnRzQgUFZGVidHMFC2VxV0Ftb3VudHNBBQtlcVdBbW91bnRzQgFpAQlyZXBsZW5pc2gEBHBvb2wIbGV2ZXJhZ2UIYm9ycm93SWQNc3Rha2VUb01hcmtldAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQOYWxsb3dlZEJBc3NldHMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBRhrUG9vbEFsbG93ZWRCb3Jyb3dBc3NldHMCAAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwMJAGYCAGQFCGxldmVyYWdlBgkAZgIFCGxldmVyYWdlAKwCCQACAQIfTGV2ZXJhZ2UgY2FuJ3QgYmUgPDEwMCBhbmQgPjMwMAMDCQEBIQEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYW5Cb3Jyb3cJAGYCBQhsZXZlcmFnZQBkBwkAAgECHVlvdSBjYW4ndCBib3Jyb3cgaW4gdGhpcyBwb29sAwMDCQBmAgUIbGV2ZXJhZ2UAZAkBAiE9AgUOYWxsb3dlZEJBc3NldHMCAAcJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJALUJAgUOYWxsb3dlZEJBc3NldHMCASwFCGJvcnJvd0lkBwkAAgECG1lvdSBjYW4ndCBib3Jyb3cgdGhpcyBhc3NldAMDBQ1zdGFrZVRvTWFya2V0CQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQxrUG9vbFBNQXJrZXQHBwkAAgECJlRoaXMgcG9vbCBjYW4ndCBzdGFrZSB0byBwdXp6bGUgbWFya2V0BA0kdDA1NTUzNDU1NjI0CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDU1NTM0NTU2MjQCXzEEA0JJZAgFDSR0MDU1NTM0NTU2MjQCXzIEBGJhbEEIBQ0kdDA1NTUzNDU1NjI0Al8zBARiYWxCCAUNJHQwNTU1MzQ1NTYyNAJfNAQHc2hhcmVJZAgFDSR0MDU1NTM0NTU2MjQCXzUDAwkBAiE9AgUIYm9ycm93SWQFA0FJZAkBAiE9AgUIYm9ycm93SWQFA0JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEDSR0MDU1NzA1NTU3NjQJARJwYXJzZVJlcGxlbmlzaFBtdHMDCAUBaQhwYXltZW50cwUDQUlkBQNCSWQEBHBtdEEIBQ0kdDA1NTcwNTU1NzY0Al8xBARwbXRCCAUNJHQwNTU3MDU1NTc2NAJfMgQEdXNlcgkApQgBCAUBaQZjYWxsZXIECW5ld1Bvc051bQkBGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEFBHVzZXIDCQBmAgUIbGV2ZXJhZ2UAZAQMYm9ycm93QW1vdW50CQEQY2FsY0JvcnJvd0Ftb3VudAYFBHBtdEEFBHBtdEIFA0FJZAUDQklkBQhsZXZlcmFnZQUIYm9ycm93SWQEB3JlcXVlc3QJALkJAgkAzAgCBQR1c2VyCQDMCAIFBHBvb2wJAMwIAgkApAMBBQRwbXRBCQDMCAIFA0FJZAkAzAgCCQCkAwEFBHBtdEIJAMwIAgUDQklkCQDMCAIJAKQDAQUEYmFsQQkAzAgCCQCkAwEFBGJhbEIJAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCCQCkAwEFDGJvcnJvd0Ftb3VudAkAzAgCCQClAwEFDXN0YWtlVG9NYXJrZXQFA25pbAIBLAQMbmV3UmVxdWVzdElkCgABQAkA/AcEBQR0aGlzAhBjcmVhdGVOZXdSZXF1ZXN0CQDMCAIFB3JlcXVlc3QFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQxuZXdSZXF1ZXN0SWQFDG5ld1JlcXVlc3RJZAQEYXJncwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQluZXdQb3NOdW0JAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCBQxib3Jyb3dBbW91bnQJAMwIAgkApQgBBQR0aGlzCQDMCAICEXJlcGxlbmlzaEZyb21MYW5kCQDMCAIJAKQDAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQxuZXdSZXF1ZXN0SWQCGENhbid0IGNyZWF0ZSBuZXcgcmVxdWVzdAUDbmlsBANpbnYJAP0HBAkBDmdldExlbmRTcnZBZGRyAAINZmxhc2hQb3NpdGlvbgUEYXJncwUDbmlsAwkAAAIFA2ludgUDaW52BAp1c2VyU3Rha2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQluZXdQb3NOdW0FDWtVc2VyUG9zaXRpb24EDSR0MDU2Nzg3NTY4ODEJAQ9nZXRQb29sQmFsYW5jZXMECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFA0FJZAUDQklkAwkAAAIFDSR0MDU2Nzg3NTY4ODEFDSR0MDU2Nzg3NTY4ODEEB25ld0JhbEIIBQ0kdDA1Njc4NzU2ODgxAl8yBAduZXdCYWxBCAUNJHQwNTY3ODc1Njg4MQJfMQQIcHJJbXBhY3QJAQ9jYWxjUHJpY2VJbXBhY3QEBQRiYWxBBQRiYWxCBQduZXdCYWxBBQduZXdCYWxCBA0kdDA1Njk1MTU3MDY2CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNTY5NTE1NzA2NgJfMQQId0Ftb3VudEIIBQ0kdDA1Njk1MTU3MDY2Al8yBA9mdXR1cmVCb3Jyb3dBcHkJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIWY2FsY3VsYXRlVG9rZW5JbnRlcmVzdAkAzAgCBQhib3Jyb3dJZAkAzAgCBwUDbmlsBQNuaWwDCQAAAgUPZnV0dXJlQm9ycm93QXB5BQ9mdXR1cmVCb3Jyb3dBcHkJAJQKAgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCCQDMCAIFD2Z1dHVyZUJvcnJvd0FweQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDA1NzIzODU3MzY4CQEPcmVwbGVuaXNoQnlUeXBlCwUFcFR5cGUFBHBvb2wFC05PX0xPQU5fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAUNc3Rha2VUb01hcmtldAMJAAACBQ0kdDA1NzIzODU3MzY4BQ0kdDA1NzIzODU3MzY4BAdheGx5RmVlCAUNJHQwNTcyMzg1NzM2OAJfMgQKdXNlclN0YWtlZAgFDSR0MDU3MjM4NTczNjgCXzEEDSR0MDU3Mzc0NTc0NjgJAQ9nZXRQb29sQmFsYW5jZXMECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFA0FJZAUDQklkAwkAAAIFDSR0MDU3Mzc0NTc0NjgFDSR0MDU3Mzc0NTc0NjgEB25ld0JhbEIIBQ0kdDA1NzM3NDU3NDY4Al8yBAduZXdCYWxBCAUNJHQwNTczNzQ1NzQ2OAJfMQQIcHJJbXBhY3QJAQ9jYWxjUHJpY2VJbXBhY3QEBQRiYWxBBQRiYWxCBQduZXdCYWxBBQduZXdCYWxCBA0kdDA1NzUzODU3NjUzCQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNTc1Mzg1NzY1MwJfMQQId0Ftb3VudEIIBQ0kdDA1NzUzODU3NjUzAl8yCQCUCgIJAM4IAgkBEHJlcGxlbmlzaEVudHJpZXMJBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQluZXdQb3NOdW0FB3NoYXJlSWQFBXBUeXBlBwUNc3Rha2VUb01hcmtldAkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQJAMwIAgkApAMBBQh3QW1vdW50QQkAzAgCCQCkAwEFCHdBbW91bnRCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIJAMwIAgAABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBQkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHAgABaQEQd2l0aGRyYXdPbmVUb2tlbgMEcG9vbAVwb3NJZAd0b2tlbklkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgUJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwUHdG9rZW5JZAFpARRjcmVhdGVVcGRhdGVTdG9wTG9zcwQFcG9zSWQGcG9vbElkB2Fzc2V0SWQFcHJpY2UJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBnBvb2xJZAIBXwkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAAIBAhpUaGVyZSBhcmUgbm8gdXNlciBwb3NpdGlvbgMJAGcCAAAFBXByaWNlCQACAQIcUHJpY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCBQVwcmljZQUQdG9rZW5PcmFjbGVQcmljZQkAAgECK1ByaWNlIG11c3QgYmUgbGVzcyB0aGFuIGN1cnJlbnQgdG9rZW4gcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUFcHJpY2UFA25pbAFpAQ5kZWxldGVTdG9wTG9zcwMFcG9zSWQGcG9vbElkB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwkAAgECCE5vIGVudHJ5CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUDbmlsAWkBBGluaXQNDG1vbmV5Qm94QWRkcg1zZkZhcm1pbmdBZGRyCGxlbmRBZGRyD3ByaWNlT3JhY2xlQWRkchBrZWVwZXJFeENvbnRyYWN0Dnd4U3dhcENvbnRyYWN0C3N3b3BBc3NldElkCXd4QXNzZXRJZA5vcGVyYXRvclB1YktleRJncm91cDFBZG1pbjFQdWJLZXkSZ3JvdXAxQWRtaW4yUHViS2V5Emdyb3VwMkFkbWluMVB1YktleRJncm91cDJBZG1pbjJQdWJLZXkJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCiCAEFD2tPcGVyYXRvckNhbGxQSwkAAgECDkFscmVhZHkgaW5pdGVkAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQxtb25leUJveEFkZHIJAAIBAiNtb25leUJveEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUNc2ZGYXJtaW5nQWRkcgkAAgECJHNmRmFybWluZ0FkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUIbGVuZEFkZHIJAAIBAh9sZW5kQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ9wcmljZU9yYWNsZUFkZHIJAAIBAiZwcmljZU9yYWNsZUFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUQa2VlcGVyRXhDb250cmFjdAkAAgECJ2tlZXBlckV4Q29udHJhY3QgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQtzd29wQXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFCXd4QXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBAiE9AgkAyAEBCQDZBAEFDm9wZXJhdG9yUHViS2V5ACAJAAIBAh1vcGVyYXRvclB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAkAzAgCCQELU3RyaW5nRW50cnkCBQlrTW9uZXlCb3gFDG1vbmV5Qm94QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ5rU0ZGYXJtaW5nQWRkcgUNc2ZGYXJtaW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrTGVuZFNlcnZpY2UFCGxlbmRBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtQcmljZU9yYWNsZQUPcHJpY2VPcmFjbGVBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2tFeENvbnRyYWN0BRBrZWVwZXJFeENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tXeFN3YXBDb250cmFjdAUOd3hTd2FwQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1N3b3BJZAULc3dvcEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa1d4SWQFCXd4QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rT3BlcmF0b3JDYWxsUEsFDm9wZXJhdG9yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjFQSwUSZ3JvdXAxQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjJQSwUSZ3JvdXAxQWRtaW4yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjFQSwUSZ3JvdXAyQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjJQSwUSZ3JvdXAyQWRtaW4yUHViS2V5BQNuaWwBaQEQY3JlYXRlTmV3UmVxdWVzdAEGcGFyYW1zCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkEDG5ld1JlcXVlc3RJZAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa1JlcXVlc3RJdGVyAAAAAQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkApAMBBQxuZXdSZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFBnBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1JlcXVlc3RJdGVyBQxuZXdSZXF1ZXN0SWQFA25pbAUMbmV3UmVxdWVzdElkAWkBEXJlcGxlbmlzaEZyb21MYW5kAQlyZXF1ZXN0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQNJHQwNjI4NzY2Mjk5NQkBDHBhcnNlUmVxdWVzdAEFCXJlcXVlc3RJZAQEdXNlcggFDSR0MDYyODc2NjI5OTUCXzEEBHBvb2wIBQ0kdDA2Mjg3NjYyOTk1Al8yBARwbXRBCAUNJHQwNjI4NzY2Mjk5NQJfMwQDQUlkCAUNJHQwNjI4NzY2Mjk5NQJfNAQEcG10QggFDSR0MDYyODc2NjI5OTUCXzUEA0JJZAgFDSR0MDYyODc2NjI5OTUCXzYEBGJhbEEIBQ0kdDA2Mjg3NjYyOTk1Al83BARiYWxCCAUNJHQwNjI4NzY2Mjk5NQJfOAQHc2hhcmVJZAgFDSR0MDYyODc2NjI5OTUCXzkEB2J3QXNzZXQIBQ0kdDA2Mjg3NjYyOTk1A18xMAQIYndBbW91bnQIBQ0kdDA2Mjg3NjYyOTk1A18xMQQNc3Rha2VUb01hcmtldAgFDSR0MDYyODc2NjI5OTUDXzEyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA2MzE4NTYzMjg1AwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNjMxODU2MzI4NQJfMQQHcG10QWxsQggFDSR0MDYzMTg1NjMyODUCXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA2MzM2NzYzNDk3CQEPcmVwbGVuaXNoQnlUeXBlCwUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAUNc3Rha2VUb01hcmtldAQKdXNlclN0YWtlZAgFDSR0MDYzMzY3NjM0OTcCXzEEB2F4bHlGZWUIBQ0kdDA2MzM2NzYzNDk3Al8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwkFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBQ1zdGFrZVRvTWFya2V0BA0kdDA2Mzg3MjYzOTg3CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNjM4NzI2Mzk4NwJfMQQId0Ftb3VudEIIBQ0kdDA2Mzg3MjYzOTg3Al8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkJAQxsaXF1aWRhdGVQb3MECAUBaQZjYWxsZXIFBHVzZXIFBXBvc0lkBQ9saXF1aWRhdGVBbW91bnQBaQEIc3RvcExvc3MEBHVzZXIFcG9zSWQEcG9vbAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEDXN0b3BMb3NzUHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MCCE5vIGVudHJ5AwkAZgIFEHRva2VuT3JhY2xlUHJpY2UFDXN0b3BMb3NzUHJpY2UJAAIBAiNUb2tlbiBwcmljZSBncmVhdGVyIHN0b3AgbG9zcyBwcmljZQQDcmVzCQEOd2l0aGRyYXdUb1VzZXIFBQR1c2VyBQRwb29sCQCkAwEFBXBvc0lkBgIACQCUCgIJAM0IAggFA3JlcwJfMQkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCAUDcmVzAl8yAWkBDGNhcGl0YWxpemVFeAUEcG9vbAVyb3V0ZQl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEBmNoYW5nZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlAAAECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQNJHQwNjU0MDM2NTQ2OQkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANBSWQIBQ0kdDA2NTQwMzY1NDY5Al8xBANCSWQIBQ0kdDA2NTQwMzY1NDY5Al8yBARiYWxBCAUNJHQwNjU0MDM2NTQ2OQJfMwQEYmFsQggFDSR0MDY1NDAzNjU0NjkCXzQEB3NoYXJlSWQIBQ0kdDA2NTQwMzY1NDY5Al81BBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBAxpc01hcmtldFBvb2wJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQxrUG9vbFBNQXJrZXQHBA0kdDA2NTU5ODY2NDI0AwkAZgIFEGFtb3VudFRvRXhjaGFuZ2UAAAQNJHQwNjU2NjA2NTc1NwkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlAAADCQAAAgUNJHQwNjU2NjA2NTc1NwUNJHQwNjU2NjA2NTc1NwQMY2xhaW1lZEFzc2V0CAUNJHQwNjU2NjA2NTc1NwJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDY1NjYwNjU3NTcCXzEEBXJBcmdzCQC1CQIFBXJvdXRlAgJfXwQPZXhjaGFuZ2VkQW1vdW50AwkAZgIFEGFtb3VudFRvRXhjaGFuZ2UAAAMJAAACCQCRAwIFBXJBcmdzAAACEGRpcmVjdFN3b3BmaUNQTU0JARBkaXJlY3RTd29wZmlDUE1NAgUFckFyZ3MFCXRva2VuVG9JZAMJAAACCQCRAwIFBXJBcmdzAAACDXJvdXRpbmdTd29wZmkJARNkaXJlY3RSb3V0aW5nU3dvcGZpAgUFckFyZ3MFCXRva2VuVG9JZAkAAgECC1dyb25nIHJvdXRlAAADCQAAAgUPZXhjaGFuZ2VkQW1vdW50BQ9leGNoYW5nZWRBbW91bnQECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsBA0kdDA2NjI1NDY2MzY0CQEKY2FwaXRhbGl6ZQkFBHBvb2wFBXBUeXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQEC2NhcEVudGVyaXNlCAUNJHQwNjYyNTQ2NjM2NAJfMQQGc3Rha2VkCAUNJHQwNjYyNTQ2NjM2NAJfMgkAlAoCCQDOCAIFC2NhcEVudGVyaXNlBQtjaGFuZ2VFbnRyeQUGc3Rha2VkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFA25pbAAABAtjYXBFbnRlcmlzZQgFDSR0MDY1NTk4NjY0MjQCXzEEBnN0YWtlZAgFDSR0MDY1NTk4NjY0MjQCXzIEDSR0MDY2NDI3NjY1NDQDBQxpc01hcmtldFBvb2wJARZjYXBpdGFsaXplUHV6emxlTWFya2V0AwUEcG9vbAUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsAAAEEG1hcmtldENhcEVudGVyaXMIBQ0kdDA2NjQyNzY2NTQ0Al8xBAxzdGFrZWRNYXJrZXQIBQ0kdDA2NjQyNzY2NTQ0Al8yCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCCQBkAgUQdG90YWxTaGFyZUFtb3VudAUGc3Rha2VkBQxzdGFrZWRNYXJrZXQFA25pbAULY2FwRW50ZXJpc2UFEG1hcmtldENhcEVudGVyaXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkBQNuaWwBaQEOY2FwaXRhbGl6ZU5vRXgDBHBvb2wFY2xhaW0RYW1vdW50RnJvbUJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDY2OTc5NjcwNDUJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwNjY5Nzk2NzA0NQJfMQQDQklkCAUNJHQwNjY5Nzk2NzA0NQJfMgQEYmFsQQgFDSR0MDY2OTc5NjcwNDUCXzMEBGJhbEIIBQ0kdDA2Njk3OTY3MDQ1Al80BAdzaGFyZUlkCAUNJHQwNjY5Nzk2NzA0NQJfNQQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQNJHQwNjcwOTc2NzE5NQkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltAAAFEWFtb3VudEZyb21CYWxhbmNlAwkAAAIFDSR0MDY3MDk3NjcxOTUFDSR0MDY3MDk3NjcxOTUEDGNsYWltZWRBc3NldAgFDSR0MDY3MDk3NjcxOTUCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA2NzA5NzY3MTk1Al8xBA0kdDA2NzE5ODY3MzI0CQEKY2FwaXRhbGl6ZQkFBHBvb2wFBXBUeXBlCQEMYXNzZXRJZFRvU3RyAQUMY2xhaW1lZEFzc2V0BQ1jbGFpbWVkQW1vdW50BQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQLY2FwRW50ZXJpc2UIBQ0kdDA2NzE5ODY3MzI0Al8xBAZzdGFrZWQIBQ0kdDA2NzE5ODY3MzI0Al8yCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgUQdG90YWxTaGFyZUFtb3VudAUGc3Rha2VkBQNuaWwFC2NhcEVudGVyaXNlCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXROZXdQb29sDAR0eXBlCHBvb2xUeXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cKY2FuUE1hcmtldBNhbGxvd2VkQm9ycm93QXNzZXRzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwMJAQIhPQIFBHR5cGUFB1NGX1BPT0wJAQIhPQIFBHR5cGUFB1dYX1BPT0wHCQACAQIKV3JvbmcgdHlwZQMDCQECIT0CBQhwb29sVHlwZQUEQ1BNTQkBAiE9AgUIcG9vbFR5cGUFBEZMQVQHCQACAQIPV3JvbmcgcG9vbCB0eXBlBA0kdDA2Nzk3ODY4MDcyCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUIcG9vbEFkZHIFBHR5cGUEA2FJZAgFDSR0MDY3OTc4NjgwNzICXzEEA2JJZAgFDSR0MDY3OTc4NjgwNzICXzIEBGFCYWwIBQ0kdDA2Nzk3ODY4MDcyAl8zBARiQmFsCAUNJHQwNjc5Nzg2ODA3MgJfNAQHc2hhcmVJZAgFDSR0MDY3OTc4NjgwNzICXzUDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAQYYWxsb3dlZEJvcnJvd0Fzc2V0c0VudHJ5AwkBAiE9AgUTYWxsb3dlZEJvcnJvd0Fzc2V0cwIACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIcG9vbEFkZHIFGGtQb29sQWxsb3dlZEJvcnJvd0Fzc2V0cwUTYWxsb3dlZEJvcnJvd0Fzc2V0cwUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtQb29sSW50ZXJlc3RMb2FuAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBWtQb29sBQhwb29sQWRkcgUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHBvb2xBZGRyBQlrUG9vbFR5cGUFCHBvb2xUeXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAUIcG9vbEFkZHIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUIcG9vbEFkZHIFDmtQb29sQ2FuQm9ycm93BQljYW5Cb3Jyb3cJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUIcG9vbEFkZHIFDGtQb29sUE1BcmtldAUKY2FuUE1hcmtldAUDbmlsBRhhbGxvd2VkQm9ycm93QXNzZXRzRW50cnkBaQEOdXBkYXRlUG9vbEZlZXMHCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUIcG9vbEFkZHIJAAIBCQCsAgICGkNhbid0IGZpbmQgcG9vbCB3aXRoIGFkZHIgBQhwb29sQWRkcgMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgUDbmlsAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhNkQXBwIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgUDbmlsAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECFWRBcHAgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcFA25pbAFpARBhY3RpdmF0ZUZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECHWRBcHAgYWxyZWFkeSBhY3RpdmUgZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMGBQNuaWwBaQEQc2h1dGRvd25Gb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECH2RBcHAgYWxyZWFkeSBzaHV0ZG93biBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwcFA25pbAFpAQphY3RpdmF0ZVNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhVTV09QRkkgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25TRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhdTV09QRkkgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQphY3RpdmF0ZVdYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhFXWCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93bldYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECE1dYIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEMYWN0aXZhdGVQb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECE1Bvb2wgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGBQNuaWwBaQEMc2h1dGRvd25Qb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQIVUG9vbCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBwUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUOZ3JvdXAxQWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQ5ncm91cDFBZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDmdyb3VwMUFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBRNtdWx0aVNpZ25lZEJ5QWRtaW5zNxYiKg==", "height": 4099614, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DpbaoMmAyncRKSv6YP1YJTG3LocwnKT5of1x6PATNfF2 Next: 7n2fwDchrRppM8kdPnoeNzKsbKaT7DWkZyQE3iXgqHFv Diff:
OldNewDifferences
434434 let prices = getAssetsPrice([aId, bId])
435435 let dPriceA = prices[0]
436436 let dPriceB = prices[1]
437- if (if ((0 > dPriceA))
438- then true
439- else (0 > dPriceB))
437+ let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
438+ let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
439+ let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
440+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
441+ let sum = if (if ((dPriceA > 0))
442+ then (dPriceB > 0)
443+ else false)
444+ then (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
445+ else if ((dPriceA > 0))
446+ then (fraction(aBalance, dPriceA, APrecision) * 2)
447+ else if ((dPriceB > 0))
448+ then (fraction(bBalance, dPriceB, BPrecision) * 2)
449+ else -1
450+ if ((0 > sum))
440451 then -1
441- else {
442- let shareSupply = getShareSupply(poolAddr, pType, shareId)
443- let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
444- let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
445- let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
446- let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
447- fraction(sum, sharePrecision, shareSupply)
448- }
452+ else fraction(sum, sharePrecision, shareSupply)
449453 }
450454
451455
509513 }
510514 else if ((pType == WX_POOL))
511515 then {
512- let $t01515615422 = $Tuple2(split({
516+ let $t01535315619 = $Tuple2(split({
513517 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
514518 if ($isInstanceOf(@, "String"))
515519 then @
520524 then @
521525 else throw(($getType(@) + " couldn't be cast to String"))
522526 }, "__"))
523- if (($t01515615422 == $t01515615422))
527+ if (($t01535315619 == $t01535315619))
524528 then {
525- let evalPutInB = $t01515615422._2
526- let evalPutInA = $t01515615422._1
529+ let evalPutInB = $t01535315619._2
530+ let evalPutInA = $t01535315619._1
527531 let lpInA = parseIntValue(evalPutInA[1])
528532 let lpInB = parseIntValue(evalPutInB[1])
529533 if ((lpInB > lpInA))
592596
593597 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
594598 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
595- let $t01815918841 = if (fromMarket)
599+ let $t01835619038 = if (fromMarket)
596600 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
597601 else if ((pType == SF_POOL))
598602 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
604608 else $Tuple3(addressFromStringValue(proxyAddr), "wxUnstakeLp", [toString(farmAddr), shareId, amount])
605609 }
606610 else unknownPoolType()
607- let farmAddr = $t01815918841._1
608- let fName = $t01815918841._2
609- let params = $t01815918841._3
611+ let farmAddr = $t01835619038._1
612+ let fName = $t01835619038._2
613+ let params = $t01835619038._3
610614 let inv = invoke(farmAddr, fName, params, nil)
611615 if ((inv == inv))
612616 then amount
619623 let feeScale6 = 1000000
620624 let fee = getIntegerValue(poolAddr, kSFPoolFee)
621625 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
622- let $t01926319569 = if ((assetTokenToGet == assetIdA))
626+ let $t01946019766 = if ((assetTokenToGet == assetIdA))
623627 then {
624628 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
625629 $Tuple2(amountToPay, assetIdB)
628632 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
629633 $Tuple2(amountToPay, assetIdA)
630634 }
631- let amountToPay = $t01926319569._1
632- let assetToPay = $t01926319569._2
635+ let amountToPay = $t01946019766._1
636+ let assetToPay = $t01946019766._2
633637 $Tuple2(assetToPay, amountToPay)
634638 }
635639
696700 if ((amountGetMax == amountGetMax))
697701 then {
698702 func hdm (a,index) = {
699- let $t02152421545 = a
700- let pay = $t02152421545._1
701- let payMax = $t02152421545._2
703+ let $t02172121742 = a
704+ let pay = $t02172121742._1
705+ let payMax = $t02172121742._2
702706 let payNext = ((pay + payMax) / 2)
703707 let amountGetNext = {
704708 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
739743
740744
741745 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
742- let $t02214322182 = getWXSwapFees(pool)
743- let pFee = $t02214322182._1
744- let prFee = $t02214322182._2
746+ let $t02234022379 = getWXSwapFees(pool)
747+ let pFee = $t02234022379._1
748+ let prFee = $t02234022379._2
745749 let poolType = valueOrElse(getString(this, (pool + kPoolType)), CPMM)
746750 let feeScale = toBigInt(100000000)
747751 if ((poolType == FLAT))
748752 then calcFlatToPay(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
749753 else {
750- let $t02241522723 = if ((assetTokenToGet == assetIdA))
754+ let $t02261222920 = if ((assetTokenToGet == assetIdA))
751755 then {
752756 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
753757 $Tuple2(amountToPay, assetIdB)
756760 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
757761 $Tuple2(amountToPay, assetIdA)
758762 }
759- let amountToPay = $t02241522723._1
760- let assetToPay = $t02241522723._2
763+ let amountToPay = $t02261222920._1
764+ let assetToPay = $t02261222920._2
761765 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
762766 $Tuple2(assetToPay, amountToPayWithFee)
763767 }
770774 then true
771775 else (poolFB != ""))
772776 then {
773- let $t02316423376 = if ((poolFB == ""))
777+ let $t02336123573 = if ((poolFB == ""))
774778 then $Tuple3(balA, balB, pool)
775779 else {
776- let $t02327023343 = getSFPoolBalances(addressFromStringValue(poolFB))
777- let sfBalA = $t02327023343._1
778- let sfBalB = $t02327023343._2
780+ let $t02346723540 = getSFPoolBalances(addressFromStringValue(poolFB))
781+ let sfBalA = $t02346723540._1
782+ let sfBalB = $t02346723540._2
779783 $Tuple3(sfBalA, sfBalB, poolFB)
780784 }
781- let pBalA = $t02316423376._1
782- let pBalB = $t02316423376._2
783- let exPool = $t02316423376._3
784- let $t02338123507 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
785- let assetToPay = $t02338123507._1
786- let amountToPay = $t02338123507._2
785+ let pBalA = $t02336123573._1
786+ let pBalB = $t02336123573._2
787+ let exPool = $t02336123573._3
788+ let $t02357823704 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
789+ let assetToPay = $t02357823704._1
790+ let amountToPay = $t02357823704._2
787791 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
788792 }
789793 else if ((pType == WX_POOL))
790794 then {
791- let $t02370923831 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
792- let assetToPay = $t02370923831._1
793- let amountToPay = $t02370923831._2
795+ let $t02390624028 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
796+ let assetToPay = $t02390624028._1
797+ let amountToPay = $t02390624028._2
794798 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
795799 }
796800 else unknownPoolType()
828832
829833
830834 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
831- let $t02496025431 = if ((pType == SF_POOL))
835+ let $t02515725628 = if ((pType == SF_POOL))
832836 then {
833837 let inv = {
834838 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
863867 else throw("Strict value is not equal to itself.")
864868 }
865869 else unknownPoolType()
866- let amountA = $t02496025431._1
867- let amountB = $t02496025431._2
870+ let amountA = $t02515725628._1
871+ let amountB = $t02515725628._2
868872 $Tuple2(amountA, amountB)
869873 }
870874
888892 }
889893 else if ((pType == WX_POOL))
890894 then {
891- let $t02587125950 = getWXPoolData(addressFromStringValue(pool))
892- let aId = $t02587125950._1
893- let bId = $t02587125950._2
894- let aBal = $t02587125950._3
895- let bBal = $t02587125950._4
896- let lpId = $t02587125950._5
895+ let $t02606826147 = getWXPoolData(addressFromStringValue(pool))
896+ let aId = $t02606826147._1
897+ let bId = $t02606826147._2
898+ let aBal = $t02606826147._3
899+ let bBal = $t02606826147._4
900+ let lpId = $t02606826147._5
897901 let balBefore = accountBalance(WXID)
898902 if ((balBefore == balBefore))
899903 then {
919923 if ((lpBalanceBefore == lpBalanceBefore))
920924 then {
921925 let poolAddr = addressFromStringValue(pool)
922- let $t02675527183 = if (if ((pmtA > 0))
926+ let $t02695227380 = if (if ((pmtA > 0))
923927 then (pmtB > 0)
924928 else false)
925929 then {
926- let $t02682126943 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
927- let pmtInA = $t02682126943._1
928- let pmtInB = $t02682126943._2
929- let change = $t02682126943._3
930- let changeId = $t02682126943._4
930+ let $t02701827140 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
931+ let pmtInA = $t02701827140._1
932+ let pmtInB = $t02701827140._2
933+ let change = $t02701827140._3
934+ let changeId = $t02701827140._4
931935 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
932936 if ((inv == inv))
933937 then $Tuple2(change, changeId)
938942 else if ((pmtB > 0))
939943 then $Tuple2(pmtB, bId)
940944 else throw("pmts must be > 0")
941- let change = $t02675527183._1
942- let changeId = $t02675527183._2
945+ let change = $t02695227380._1
946+ let changeId = $t02695227380._2
943947 let inv = if ((change > 0))
944948 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
945949 else nil
973977 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
974978 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
975979 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
976- let $t02864429469 = if (withLoan)
980+ let $t02884129666 = if (withLoan)
977981 then if (stakeToMarket)
978982 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
979983 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
980984 else if (stakeToMarket)
981985 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
982986 else $Tuple2(poolInterestNoLoan, nil)
983- let curPoolInterest = $t02864429469._1
984- let adEntry = $t02864429469._2
987+ let curPoolInterest = $t02884129666._1
988+ let adEntry = $t02884129666._2
985989 ([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)
986990 }
987991
10801084 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10811085 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10821086 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
1083- let $t03254732647 = if ((tokenId == AId))
1087+ let $t03274432844 = if ((tokenId == AId))
10841088 then $Tuple2((tokenAmount - axlyFee), 0)
10851089 else $Tuple2(0, (tokenAmount - axlyFee))
1086- let pmtA = $t03254732647._1
1087- let pmtB = $t03254732647._2
1088- let $t03265032761 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1089- let stakedAmount = $t03265032761._1
1090- let nf = $t03265032761._2
1090+ let pmtA = $t03274432844._1
1091+ let pmtB = $t03274432844._2
1092+ let $t03284732958 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1093+ let stakedAmount = $t03284732958._1
1094+ let nf = $t03284732958._2
10911095 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10921096 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
10931097 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
12091213 let userAddr = Address(fromBase58String(user))
12101214 let poolAddr = Address(fromBase58String(pool))
12111215 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1212- let $t03881238884 = getPoolData(poolAddr, pType)
1213- let idAStr = $t03881238884._1
1214- let idBStr = $t03881238884._2
1215- let balA = $t03881238884._3
1216- let balB = $t03881238884._4
1217- let shareId = $t03881238884._5
1218- let $t03888738954 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1219- let idA = $t03888738954._1
1220- let idB = $t03888738954._2
1216+ let $t03901239084 = getPoolData(poolAddr, pType)
1217+ let idAStr = $t03901239084._1
1218+ let idBStr = $t03901239084._2
1219+ let balA = $t03901239084._3
1220+ let balB = $t03901239084._4
1221+ let shareId = $t03901239084._5
1222+ let $t03908739154 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1223+ let idA = $t03908739154._1
1224+ let idB = $t03908739154._2
12211225 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
12221226 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12231227 let cBalABefore = accountBalance(idA)
12511255 let cBalBAfter = accountBalance(idB)
12521256 if ((cBalBAfter == cBalBAfter))
12531257 then {
1254- let $t03996240051 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1255- let tokensAmountA = $t03996240051._1
1256- let tokensAmountB = $t03996240051._2
1257- let $t04005441299 = if (isBorrowed)
1258+ let $t04016240251 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1259+ let tokensAmountA = $t04016240251._1
1260+ let tokensAmountB = $t04016240251._2
1261+ let $t04025441499 = if (isBorrowed)
12581262 then {
12591263 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12601264 let debt = {
13031307 else throw("Strict value is not equal to itself.")
13041308 }
13051309 else $Tuple2(tokensAmountA, tokensAmountB)
1306- let toUserA = $t04005441299._1
1307- let toUserB = $t04005441299._2
1310+ let toUserA = $t04025441499._1
1311+ let toUserB = $t04025441499._2
13081312 let poolTotalLoanEntries = if (isBorrowed)
13091313 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
13101314 else nil
13131317 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
13141318 else nil))
13151319 else nil
1316- let $t04171242107 = if (if ((withdrawToken == idAStr))
1320+ let $t04191242307 = if (if ((withdrawToken == idAStr))
13171321 then (toUserB > 0)
13181322 else false)
13191323 then {
13321336 else throw("Strict value is not equal to itself.")
13331337 }
13341338 else $Tuple2(toUserA, toUserB)
1335- let toUserACalc = $t04171242107._1
1336- let toUserBCalc = $t04171242107._2
1339+ let toUserACalc = $t04191242307._1
1340+ let toUserBCalc = $t04191242307._2
13371341 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))
13381342 $Tuple2(entries, [toUserACalc, toUserBCalc])
13391343 }
13621366 let userAddr = Address(fromBase58String(user))
13631367 let poolAddr = Address(fromBase58String(pool))
13641368 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1365- let $t04403244104 = getPoolData(poolAddr, pType)
1366- let idAStr = $t04403244104._1
1367- let idBStr = $t04403244104._2
1368- let balA = $t04403244104._3
1369- let balB = $t04403244104._4
1370- let shareId = $t04403244104._5
1371- let $t04410744174 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1372- let idA = $t04410744174._1
1373- let idB = $t04410744174._2
1369+ let $t04423244304 = getPoolData(poolAddr, pType)
1370+ let idAStr = $t04423244304._1
1371+ let idBStr = $t04423244304._2
1372+ let balA = $t04423244304._3
1373+ let balB = $t04423244304._4
1374+ let shareId = $t04423244304._5
1375+ let $t04430744374 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1376+ let idA = $t04430744374._1
1377+ let idB = $t04430744374._2
13741378 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
13751379 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13761380 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
14041408 let cBalBAfter = accountBalance(idB)
14051409 if ((cBalBAfter == cBalBAfter))
14061410 then {
1407- let $t04535845447 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1408- let tokensAmountA = $t04535845447._1
1409- let tokensAmountB = $t04535845447._2
1411+ let $t04555845647 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1412+ let tokensAmountA = $t04555845647._1
1413+ let tokensAmountB = $t04555845647._2
14101414 let amountToGetEx = if (if ((borrowAsset == idAStr))
14111415 then (lAmount > tokensAmountA)
14121416 else false)
14271431 let cBalBAfterRepay = accountBalance(idB)
14281432 if ((cBalBAfterRepay == cBalBAfterRepay))
14291433 then {
1430- let $t04595346180 = if ((borrowAsset == idAStr))
1434+ let $t04615346380 = if ((borrowAsset == idAStr))
14311435 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
14321436 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
1433- let toUserA = $t04595346180._1
1434- let toUserB = $t04595346180._2
1435- let $t04618346260 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1436- let balAAfter = $t04618346260._1
1437- let balBAfter = $t04618346260._2
1438- let $t04626346394 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1439- let userStaked = $t04626346394._1
1440- let axlyFee = $t04626346394._2
1437+ let toUserA = $t04615346380._1
1438+ let toUserB = $t04615346380._2
1439+ let $t04638346460 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1440+ let balAAfter = $t04638346460._1
1441+ let balBAfter = $t04638346460._2
1442+ let $t04646346594 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1443+ let userStaked = $t04646346594._1
1444+ let axlyFee = $t04646346594._2
14411445 let userLpLiqudated = (userCanWithdraw - userStaked)
1442- let $t04645346798 = if (fromMarket)
1446+ let $t04665346998 = if (fromMarket)
14431447 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
14441448 else $Tuple2(poolInterestLoan, nil)
1445- let curPoolInterest = $t04645346798._1
1446- let poolTotalMarketEntries = $t04645346798._2
1449+ let curPoolInterest = $t04665346998._1
1450+ let poolTotalMarketEntries = $t04665346998._2
14471451 $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)
14481452 }
14491453 else throw("Strict value is not equal to itself.")
14931497 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
14941498 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
14951499 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1496- let $t04852648623 = if ((borrowId == aId))
1500+ let $t04872648823 = if ((borrowId == aId))
14971501 then $Tuple2(dPriceA, decPrA)
14981502 else $Tuple2(dPriceB, decPrB)
1499- let borrowPrice = $t04852648623._1
1500- let borrowDecPr = $t04852648623._2
1503+ let borrowPrice = $t04872648823._1
1504+ let borrowDecPr = $t04872648823._2
15011505 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
15021506 }
15031507
15261530
15271531
15281532 func claimAndCheckAmnt (pool,pType,claim,amountToExchange,amountFromBalance) = {
1529- let $t04964450495 = if (claim)
1533+ let $t04984450695 = if (claim)
15301534 then {
15311535 let claimed = claimFarmed(pType, pool)
15321536 if ((amountToExchange > 0))
15551559 else unknownPoolType()
15561560 $Tuple2((amountToExchange + amountFromBalance), claimedAsset)
15571561 }
1558- if (($t04964450495 == $t04964450495))
1562+ if (($t04984450695 == $t04984450695))
15591563 then {
1560- let asset = $t04964450495._2
1561- let amount = $t04964450495._1
1564+ let asset = $t04984450695._2
1565+ let amount = $t04984450695._1
15621566 let bal = accountBalance(asset)
15631567 if ((bal == bal))
15641568 then if ((amount > bal))
15741578 func getPoolInfoREADONLY (pool) = {
15751579 let poolAddr = addressFromStringValue(pool)
15761580 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1577- let $t05084750937 = getPoolData(Address(fromBase58String(pool)), pType)
1578- let AId = $t05084750937._1
1579- let BId = $t05084750937._2
1580- let balA = $t05084750937._3
1581- let balB = $t05084750937._4
1582- let shareId = $t05084750937._5
1581+ let $t05104751137 = getPoolData(Address(fromBase58String(pool)), pType)
1582+ let AId = $t05104751137._1
1583+ let BId = $t05104751137._2
1584+ let balA = $t05104751137._3
1585+ let balB = $t05104751137._4
1586+ let shareId = $t05104751137._5
15831587 let shareSupply = getShareSupply(poolAddr, pType, shareId)
15841588 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
15851589 }
16081612 @Callable(i)
16091613 func getUserPositionREADONLY (user,pools,posNum) = {
16101614 func userPos (a,pool) = {
1611- let $t05193552005 = a
1612- let wAmountsA = $t05193552005._1
1613- let wAmountsB = $t05193552005._2
1614- let debts = $t05193552005._3
1615- let eqWAmountsA = $t05193552005._4
1616- let eqWAmountsB = $t05193552005._5
1617- let index = $t05193552005._6
1615+ let $t05213552205 = a
1616+ let wAmountsA = $t05213552205._1
1617+ let wAmountsB = $t05213552205._2
1618+ let debts = $t05213552205._3
1619+ let eqWAmountsA = $t05213552205._4
1620+ let eqWAmountsB = $t05213552205._5
1621+ let index = $t05213552205._6
16181622 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
16191623 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
16201624 else {
16211625 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1622- let $t05228452374 = getPoolData(Address(fromBase58String(pool)), pType)
1623- let AId = $t05228452374._1
1624- let BId = $t05228452374._2
1625- let balA = $t05228452374._3
1626- let balB = $t05228452374._4
1627- let shareId = $t05228452374._5
1626+ let $t05248452574 = getPoolData(Address(fromBase58String(pool)), pType)
1627+ let AId = $t05248452574._1
1628+ let BId = $t05248452574._2
1629+ let balA = $t05248452574._3
1630+ let balB = $t05248452574._4
1631+ let shareId = $t05248452574._5
16281632 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
16291633 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
16301634 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1631- let $t05272452844 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1632- let wAmountA = $t05272452844._1
1633- let wAmountB = $t05272452844._2
1635+ let $t05292453044 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1636+ let wAmountA = $t05292453044._1
1637+ let wAmountB = $t05292453044._2
16341638 if ((borrowAmount > 0))
16351639 then {
16361640 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
16641668 }
16651669 else unknownPoolType()
16661670 else 0
1667- let $t05375653975 = if ((borrowAsset == AId))
1671+ let $t05395654175 = if ((borrowAsset == AId))
16681672 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
16691673 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1670- let eqWAmountA = $t05375653975._1
1671- let eqWAmountB = $t05375653975._2
1674+ let eqWAmountA = $t05395654175._1
1675+ let eqWAmountB = $t05395654175._2
16721676 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
16731677 }
16741678 else throw("Strict value is not equal to itself.")
16771681 }
16781682 }
16791683
1680- let $t05423054341 = {
1684+ let $t05443054541 = {
16811685 let $l = pools
16821686 let $s = size($l)
16831687 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
16911695
16921696 $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)
16931697 }
1694- let wAmountsA = $t05423054341._1
1695- let wAmountsB = $t05423054341._2
1696- let debts = $t05423054341._3
1697- let eqWAmountsA = $t05423054341._4
1698- let eqWAmountsB = $t05423054341._5
1698+ let wAmountsA = $t05443054541._1
1699+ let wAmountsB = $t05443054541._2
1700+ let debts = $t05443054541._3
1701+ let eqWAmountsA = $t05443054541._4
1702+ let eqWAmountsB = $t05443054541._5
16991703 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
17001704 }
17011705
17261730 else false)
17271731 then throw("This pool can't stake to puzzle market")
17281732 else {
1729- let $t05533455424 = getPoolData(Address(fromBase58String(pool)), pType)
1730- let AId = $t05533455424._1
1731- let BId = $t05533455424._2
1732- let balA = $t05533455424._3
1733- let balB = $t05533455424._4
1734- let shareId = $t05533455424._5
1733+ let $t05553455624 = getPoolData(Address(fromBase58String(pool)), pType)
1734+ let AId = $t05553455624._1
1735+ let BId = $t05553455624._2
1736+ let balA = $t05553455624._3
1737+ let balB = $t05553455624._4
1738+ let shareId = $t05553455624._5
17351739 if (if ((borrowId != AId))
17361740 then (borrowId != BId)
17371741 else false)
17381742 then throw("Wrong borrow asset")
17391743 else {
1740- let $t05550555564 = parseReplenishPmts(i.payments, AId, BId)
1741- let pmtA = $t05550555564._1
1742- let pmtB = $t05550555564._2
1744+ let $t05570555764 = parseReplenishPmts(i.payments, AId, BId)
1745+ let pmtA = $t05570555764._1
1746+ let pmtB = $t05570555764._2
17431747 let user = toString(i.caller)
17441748 let newPosNum = getNewUserPositionNumber(user)
17451749 if ((leverage > 100))
17591763 if ((inv == inv))
17601764 then {
17611765 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1762- let $t05658756681 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1763- if (($t05658756681 == $t05658756681))
1766+ let $t05678756881 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1767+ if (($t05678756881 == $t05678756881))
17641768 then {
1765- let newBalB = $t05658756681._2
1766- let newBalA = $t05658756681._1
1769+ let newBalB = $t05678756881._2
1770+ let newBalA = $t05678756881._1
17671771 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1768- let $t05675156866 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1769- let wAmountA = $t05675156866._1
1770- let wAmountB = $t05675156866._2
1772+ let $t05695157066 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1773+ let wAmountA = $t05695157066._1
1774+ let wAmountB = $t05695157066._2
17711775 let futureBorrowApy = invoke(getLendSrvAddr(), "calculateTokenInterest", [borrowId, false], nil)
17721776 if ((futureBorrowApy == futureBorrowApy))
17731777 then $Tuple2(nil, [prImpact, wAmountA, wAmountB, futureBorrowApy])
17801784 else throw("Strict value is not equal to itself.")
17811785 }
17821786 else {
1783- let $t05703857168 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1784- if (($t05703857168 == $t05703857168))
1787+ let $t05723857368 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1788+ if (($t05723857368 == $t05723857368))
17851789 then {
1786- let axlyFee = $t05703857168._2
1787- let userStaked = $t05703857168._1
1788- let $t05717457268 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1789- if (($t05717457268 == $t05717457268))
1790+ let axlyFee = $t05723857368._2
1791+ let userStaked = $t05723857368._1
1792+ let $t05737457468 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1793+ if (($t05737457468 == $t05737457468))
17901794 then {
1791- let newBalB = $t05717457268._2
1792- let newBalA = $t05717457268._1
1795+ let newBalB = $t05737457468._2
1796+ let newBalA = $t05737457468._1
17931797 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1794- let $t05733857453 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1795- let wAmountA = $t05733857453._1
1796- let wAmountB = $t05733857453._2
1798+ let $t05753857653 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1799+ let wAmountA = $t05753857653._1
1800+ let wAmountB = $t05753857653._2
17971801 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB, 0])
17981802 }
17991803 else throw("Strict value is not equal to itself.")
18961900
18971901 @Callable(i)
18981902 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1899- let $t06267662795 = parseRequest(requestId)
1900- let user = $t06267662795._1
1901- let pool = $t06267662795._2
1902- let pmtA = $t06267662795._3
1903- let AId = $t06267662795._4
1904- let pmtB = $t06267662795._5
1905- let BId = $t06267662795._6
1906- let balA = $t06267662795._7
1907- let balB = $t06267662795._8
1908- let shareId = $t06267662795._9
1909- let bwAsset = $t06267662795._10
1910- let bwAmount = $t06267662795._11
1911- let stakeToMarket = $t06267662795._12
1903+ let $t06287662995 = parseRequest(requestId)
1904+ let user = $t06287662995._1
1905+ let pool = $t06287662995._2
1906+ let pmtA = $t06287662995._3
1907+ let AId = $t06287662995._4
1908+ let pmtB = $t06287662995._5
1909+ let BId = $t06287662995._6
1910+ let balA = $t06287662995._7
1911+ let balB = $t06287662995._8
1912+ let shareId = $t06287662995._9
1913+ let bwAsset = $t06287662995._10
1914+ let bwAmount = $t06287662995._11
1915+ let stakeToMarket = $t06287662995._12
19121916 if ((size(i.payments) != 1))
19131917 then throw("Wrong payment size")
19141918 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
19161920 else (i.payments[0].amount != bwAmount))
19171921 then throw("Wrong payment")
19181922 else {
1919- let $t06298563085 = if ((AId == bwAsset))
1923+ let $t06318563285 = if ((AId == bwAsset))
19201924 then $Tuple2((pmtA + bwAmount), pmtB)
19211925 else $Tuple2(pmtA, (pmtB + bwAmount))
1922- let pmtAllA = $t06298563085._1
1923- let pmtAllB = $t06298563085._2
1926+ let pmtAllA = $t06318563285._1
1927+ let pmtAllB = $t06318563285._2
19241928 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1925- let $t06316763297 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1926- let userStaked = $t06316763297._1
1927- let axlyFee = $t06316763297._2
1929+ let $t06336763497 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1930+ let userStaked = $t06336763497._1
1931+ let axlyFee = $t06336763497._2
19281932 let posNum = getNewUserPositionNumber(user)
19291933 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
19301934 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1931- let $t06367263787 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1932- let wAmountA = $t06367263787._1
1933- let wAmountB = $t06367263787._2
1935+ let $t06387263987 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1936+ let wAmountA = $t06387263987._1
1937+ let wAmountB = $t06387263987._2
19341938 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
19351939 }
19361940 }))
19611965 let pType = getStringValue(this, (kPool + pool))
19621966 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
19631967 let poolAddr = Address(fromBase58String(pool))
1964- let $t06520365269 = getPoolData(poolAddr, pType)
1965- let AId = $t06520365269._1
1966- let BId = $t06520365269._2
1967- let balA = $t06520365269._3
1968- let balB = $t06520365269._4
1969- let shareId = $t06520365269._5
1968+ let $t06540365469 = getPoolData(poolAddr, pType)
1969+ let AId = $t06540365469._1
1970+ let BId = $t06540365469._2
1971+ let balA = $t06540365469._3
1972+ let balB = $t06540365469._4
1973+ let shareId = $t06540365469._5
19701974 let totalShareAmount = getPoolTotalShare(pool)
19711975 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1972- let $t06539866224 = if ((amountToExchange > 0))
1976+ let $t06559866424 = if ((amountToExchange > 0))
19731977 then {
1974- let $t06546065557 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1975- if (($t06546065557 == $t06546065557))
1978+ let $t06566065757 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1979+ if (($t06566065757 == $t06566065757))
19761980 then {
1977- let claimedAsset = $t06546065557._2
1978- let claimedAmount = $t06546065557._1
1981+ let claimedAsset = $t06566065757._2
1982+ let claimedAmount = $t06566065757._1
19791983 let rArgs = split(route, "__")
19801984 let exchangedAmount = if ((amountToExchange > 0))
19811985 then if ((rArgs[0] == "directSwopfiCPMM"))
19901994 let changeEntry = if ((newChange >= 0))
19911995 then [IntegerEntry((pool + kPoolCapChange), newChange)]
19921996 else nil
1993- let $t06605466164 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1994- let capEnterise = $t06605466164._1
1995- let staked = $t06605466164._2
1997+ let $t06625466364 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1998+ let capEnterise = $t06625466364._1
1999+ let staked = $t06625466364._2
19962000 $Tuple2((capEnterise ++ changeEntry), staked)
19972001 }
19982002 else throw("Strict value is not equal to itself.")
20002004 else throw("Strict value is not equal to itself.")
20012005 }
20022006 else $Tuple2(nil, 0)
2003- let capEnterise = $t06539866224._1
2004- let staked = $t06539866224._2
2005- let $t06622766344 = if (isMarketPool)
2007+ let capEnterise = $t06559866424._1
2008+ let staked = $t06559866424._2
2009+ let $t06642766544 = if (isMarketPool)
20062010 then capitalizePuzzleMarket(pool, pType, shareId)
20072011 else $Tuple2(nil, 0)
2008- let marketCapEnteris = $t06622766344._1
2009- let stakedMarket = $t06622766344._2
2012+ let marketCapEnteris = $t06642766544._1
2013+ let stakedMarket = $t06642766544._2
20102014 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
20112015 }))
20122016
20162020 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
20172021 let pType = getStringValue(this, (kPool + pool))
20182022 let poolAddr = Address(fromBase58String(pool))
2019- let $t06677966845 = getPoolData(poolAddr, pType)
2020- let AId = $t06677966845._1
2021- let BId = $t06677966845._2
2022- let balA = $t06677966845._3
2023- let balB = $t06677966845._4
2024- let shareId = $t06677966845._5
2023+ let $t06697967045 = getPoolData(poolAddr, pType)
2024+ let AId = $t06697967045._1
2025+ let BId = $t06697967045._2
2026+ let balA = $t06697967045._3
2027+ let balB = $t06697967045._4
2028+ let shareId = $t06697967045._5
20252029 let totalShareAmount = getPoolTotalShare(pool)
2026- let $t06689766995 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2027- if (($t06689766995 == $t06689766995))
2030+ let $t06709767195 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2031+ if (($t06709767195 == $t06709767195))
20282032 then {
2029- let claimedAsset = $t06689766995._2
2030- let claimedAmount = $t06689766995._1
2031- let $t06699867124 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2032- let capEnterise = $t06699867124._1
2033- let staked = $t06699867124._2
2033+ let claimedAsset = $t06709767195._2
2034+ let claimedAmount = $t06709767195._1
2035+ let $t06719867324 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2036+ let capEnterise = $t06719867324._1
2037+ let staked = $t06719867324._2
20342038 (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
20352039 }
20362040 else throw("Strict value is not equal to itself.")
20482052 else false)
20492053 then throw("Wrong pool type")
20502054 else {
2051- let $t06777867872 = getPoolData(Address(fromBase58String(poolAddr)), type)
2052- let aId = $t06777867872._1
2053- let bId = $t06777867872._2
2054- let aBal = $t06777867872._3
2055- let bBal = $t06777867872._4
2056- let shareId = $t06777867872._5
2055+ let $t06797868072 = getPoolData(Address(fromBase58String(poolAddr)), type)
2056+ let aId = $t06797868072._1
2057+ let bId = $t06797868072._2
2058+ let aBal = $t06797868072._3
2059+ let bBal = $t06797868072._4
2060+ let shareId = $t06797868072._5
20572061 if ((0 > inFeeNoLoan))
20582062 then throw("inFeeNoLoan must be greater than 0")
20592063 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]
437- if (if ((0 > dPriceA))
438- then true
439- else (0 > dPriceB))
437+ let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
438+ let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
439+ let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
440+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
441+ let sum = if (if ((dPriceA > 0))
442+ then (dPriceB > 0)
443+ else false)
444+ then (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
445+ else if ((dPriceA > 0))
446+ then (fraction(aBalance, dPriceA, APrecision) * 2)
447+ else if ((dPriceB > 0))
448+ then (fraction(bBalance, dPriceB, BPrecision) * 2)
449+ else -1
450+ if ((0 > sum))
440451 then -1
441- else {
442- let shareSupply = getShareSupply(poolAddr, pType, shareId)
443- let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
444- let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
445- let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
446- let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
447- fraction(sum, sharePrecision, shareSupply)
448- }
452+ else fraction(sum, sharePrecision, shareSupply)
449453 }
450454
451455
452456 func getSharePrices (shareIds) = {
453457 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
454458
455459 let $l = shareIds
456460 let $s = size($l)
457461 let $acc0 = nil
458462 func $f0_1 ($a,$i) = if (($i >= $s))
459463 then $a
460464 else getPrices($a, $l[$i])
461465
462466 func $f0_2 ($a,$i) = if (($i >= $s))
463467 then $a
464468 else throw("List size exceeds 20")
465469
466470 $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)
467471 }
468472
469473
470474 func getCursEntries (aId,bId,shareId,wAmounts) = {
471475 let assetsPrices = getAssetsPrice([aId, bId])
472476 let sharePrice = getSharePrice(shareId)
473477 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
474478 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
475479 }
476480
477481
478482 func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
479483 then {
480484 let repl = {
481485 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
482486 if ($isInstanceOf(@, "List[Any]"))
483487 then @
484488 else throw(($getType(@) + " couldn't be cast to List[Any]"))
485489 }
486490 if ((repl == repl))
487491 then $Tuple5({
488492 let @ = repl[3]
489493 if ($isInstanceOf(@, "Int"))
490494 then @
491495 else throw(($getType(@) + " couldn't be cast to Int"))
492496 }, {
493497 let @ = repl[4]
494498 if ($isInstanceOf(@, "Int"))
495499 then @
496500 else throw(($getType(@) + " couldn't be cast to Int"))
497501 }, {
498502 let @ = repl[1]
499503 if ($isInstanceOf(@, "Int"))
500504 then @
501505 else throw(($getType(@) + " couldn't be cast to Int"))
502506 }, assetIdToStr(repl[2]), {
503507 let @ = repl[0]
504508 if ($isInstanceOf(@, "Int"))
505509 then @
506510 else throw(($getType(@) + " couldn't be cast to Int"))
507511 })
508512 else throw("Strict value is not equal to itself.")
509513 }
510514 else if ((pType == WX_POOL))
511515 then {
512- let $t01515615422 = $Tuple2(split({
516+ let $t01535315619 = $Tuple2(split({
513517 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
514518 if ($isInstanceOf(@, "String"))
515519 then @
516520 else throw(($getType(@) + " couldn't be cast to String"))
517521 }, "__"), split({
518522 let @ = invoke(wxRest, "poolEvaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
519523 if ($isInstanceOf(@, "String"))
520524 then @
521525 else throw(($getType(@) + " couldn't be cast to String"))
522526 }, "__"))
523- if (($t01515615422 == $t01515615422))
527+ if (($t01535315619 == $t01535315619))
524528 then {
525- let evalPutInB = $t01515615422._2
526- let evalPutInA = $t01515615422._1
529+ let evalPutInB = $t01535315619._2
530+ let evalPutInA = $t01535315619._1
527531 let lpInA = parseIntValue(evalPutInA[1])
528532 let lpInB = parseIntValue(evalPutInB[1])
529533 if ((lpInB > lpInA))
530534 then {
531535 let pmt = parseIntValue(evalPutInA[8])
532536 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
533537 }
534538 else {
535539 let pmt = parseIntValue(evalPutInB[7])
536540 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
537541 }
538542 }
539543 else throw("Strict value is not equal to itself.")
540544 }
541545 else unknownPoolType()
542546
543547
544548 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId,lpId) = {
545549 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
546550 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
547551 if ((pType == SF_POOL))
548552 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
549553 else if ((pType == WX_POOL))
550554 then if ((proxyAddr == ""))
551555 then invoke(poolAddr, "put", [1000000, false], payments)
552556 else invoke(addressFromStringValue(proxyAddr), "wxReplenishTwoTokens", [toString(poolAddr), lpId, 1000000, false], payments)
553557 else unknownPoolType()
554558 }
555559
556560
557561 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId,lpId) = {
558562 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
559563 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
560564 if ((pType == SF_POOL))
561565 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
562566 else if ((pType == WX_POOL))
563567 then {
564568 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
565569 then "putOneTknV2"
566570 else "putOneTkn"
567571 if ((proxyAddr == ""))
568572 then invoke(poolAddr, fc, [0, false], payments)
569573 else invoke(addressFromStringValue(proxyAddr), "wxReplenishOneToken", [toString(poolAddr), lpId, fc, 0, false], payments)
570574 }
571575 else unknownPoolType()
572576 }
573577
574578
575579 func stakeLP (pool,pType,shareId,amount,stakeToMarket) = {
576580 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
577581 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
578582 if (stakeToMarket)
579583 then invoke(pMarketAddr, "supply", nil, payments)
580584 else if ((pType == SF_POOL))
581585 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
582586 else if ((pType == WX_POOL))
583587 then {
584588 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
585589 if ((proxyAddr == ""))
586590 then invoke(farmAddr, "stake", nil, payments)
587591 else invoke(addressFromStringValue(proxyAddr), "wxStakeLp", [toString(farmAddr)], payments)
588592 }
589593 else unknownPoolType()
590594 }
591595
592596
593597 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
594598 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
595- let $t01815918841 = if (fromMarket)
599+ let $t01835619038 = if (fromMarket)
596600 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
597601 else if ((pType == SF_POOL))
598602 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
599603 else if ((pType == WX_POOL))
600604 then {
601605 let farmAddr = getWXFarmingAddr(Address(fromBase58String(pool)))
602606 if ((proxyAddr == ""))
603607 then $Tuple3(farmAddr, "unstake", [shareId, amount])
604608 else $Tuple3(addressFromStringValue(proxyAddr), "wxUnstakeLp", [toString(farmAddr), shareId, amount])
605609 }
606610 else unknownPoolType()
607- let farmAddr = $t01815918841._1
608- let fName = $t01815918841._2
609- let params = $t01815918841._3
611+ let farmAddr = $t01835619038._1
612+ let fName = $t01835619038._2
613+ let params = $t01835619038._3
610614 let inv = invoke(farmAddr, fName, params, nil)
611615 if ((inv == inv))
612616 then amount
613617 else throw("Strict value is not equal to itself.")
614618 }
615619
616620
617621 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
618622 let poolAddr = Address(fromBase58String(pool))
619623 let feeScale6 = 1000000
620624 let fee = getIntegerValue(poolAddr, kSFPoolFee)
621625 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
622- let $t01926319569 = if ((assetTokenToGet == assetIdA))
626+ let $t01946019766 = if ((assetTokenToGet == assetIdA))
623627 then {
624628 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
625629 $Tuple2(amountToPay, assetIdB)
626630 }
627631 else {
628632 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
629633 $Tuple2(amountToPay, assetIdA)
630634 }
631- let amountToPay = $t01926319569._1
632- let assetToPay = $t01926319569._2
635+ let amountToPay = $t01946019766._1
636+ let assetToPay = $t01946019766._2
633637 $Tuple2(assetToPay, amountToPay)
634638 }
635639
636640
637641 func getWXSwapFees (pool) = {
638642 let poolAddr = addressFromStringValue(pool)
639643 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
640644 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
641645 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
642646 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
643647 case fees: (Int, Int) =>
644648 $Tuple2(fees._1, fees._2)
645649 case _ =>
646650 $Tuple2(poolFeeDefault, protocolFeeDefault)
647651 }
648652 }
649653
650654
651655 func getWXPoolReverse (poolAddr,assetIn,assetOut) = {
652656 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
653657 let lpNonReverse = {
654658 let @ = invoke(fContract, "getLpAssetFromPoolAssetsREADONLY", [assetIn, assetOut], nil)
655659 if ($isInstanceOf(@, "String"))
656660 then @
657661 else unit
658662 }
659663 let lpReverse = {
660664 let @ = invoke(fContract, "getLpAssetFromPoolAssetsREADONLY", [assetOut, assetIn], nil)
661665 if ($isInstanceOf(@, "String"))
662666 then @
663667 else unit
664668 }
665669 if ((lpNonReverse != unit))
666670 then false
667671 else if ((lpReverse != unit))
668672 then true
669673 else throw("Pool is not exist")
670674 }
671675
672676
673677 func calcFlatToPay (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
674678 let assetIn = if ((assetTokenToGet == assetIdA))
675679 then assetIdB
676680 else assetIdA
677681 let amoutGet = {
678682 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [amountTokenToGet, assetIn, assetTokenToGet], nil)
679683 if ($isInstanceOf(@, "Int"))
680684 then @
681685 else throw(($getType(@) + " couldn't be cast to Int"))
682686 }
683687 if ((amoutGet == amoutGet))
684688 then if ((amoutGet == amountTokenToGet))
685689 then $Tuple2(assetIn, amountTokenToGet)
686690 else {
687691 let amountToPayMax = if ((amountTokenToGet > amoutGet))
688692 then fraction(amountTokenToGet, 110, 100)
689693 else fraction(amountTokenToGet, 90, 100)
690694 let amountGetMax = {
691695 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [amountToPayMax, assetIn, assetTokenToGet], nil)
692696 if ($isInstanceOf(@, "Int"))
693697 then @
694698 else throw(($getType(@) + " couldn't be cast to Int"))
695699 }
696700 if ((amountGetMax == amountGetMax))
697701 then {
698702 func hdm (a,index) = {
699- let $t02152421545 = a
700- let pay = $t02152421545._1
701- let payMax = $t02152421545._2
703+ let $t02172121742 = a
704+ let pay = $t02172121742._1
705+ let payMax = $t02172121742._2
702706 let payNext = ((pay + payMax) / 2)
703707 let amountGetNext = {
704708 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
705709 if ($isInstanceOf(@, "Int"))
706710 then @
707711 else throw(($getType(@) + " couldn't be cast to Int"))
708712 }
709713 if ((amountGetNext == amountGetNext))
710714 then if ((amountTokenToGet > amountGetNext))
711715 then $Tuple2(payNext, payMax)
712716 else $Tuple2(pay, payNext)
713717 else throw("Strict value is not equal to itself.")
714718 }
715719
716720 let resAmntToPay = {
717721 let $l = [1, 2]
718722 let $s = size($l)
719723 let $acc0 = $Tuple2(amountTokenToGet, amountToPayMax)
720724 func $f0_1 ($a,$i) = if (($i >= $s))
721725 then $a
722726 else hdm($a, $l[$i])
723727
724728 func $f0_2 ($a,$i) = if (($i >= $s))
725729 then $a
726730 else throw("List size exceeds 2")
727731
728732 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
729733 }
730734 let amountToPay = if ((amountTokenToGet > amoutGet))
731735 then resAmntToPay._2
732736 else resAmntToPay._1
733737 $Tuple2(assetIn, amountToPay)
734738 }
735739 else throw("Strict value is not equal to itself.")
736740 }
737741 else throw("Strict value is not equal to itself.")
738742 }
739743
740744
741745 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
742- let $t02214322182 = getWXSwapFees(pool)
743- let pFee = $t02214322182._1
744- let prFee = $t02214322182._2
746+ let $t02234022379 = getWXSwapFees(pool)
747+ let pFee = $t02234022379._1
748+ let prFee = $t02234022379._2
745749 let poolType = valueOrElse(getString(this, (pool + kPoolType)), CPMM)
746750 let feeScale = toBigInt(100000000)
747751 if ((poolType == FLAT))
748752 then calcFlatToPay(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
749753 else {
750- let $t02241522723 = if ((assetTokenToGet == assetIdA))
754+ let $t02261222920 = if ((assetTokenToGet == assetIdA))
751755 then {
752756 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
753757 $Tuple2(amountToPay, assetIdB)
754758 }
755759 else {
756760 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
757761 $Tuple2(amountToPay, assetIdA)
758762 }
759- let amountToPay = $t02241522723._1
760- let assetToPay = $t02241522723._2
763+ let amountToPay = $t02261222920._1
764+ let assetToPay = $t02261222920._2
761765 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
762766 $Tuple2(assetToPay, amountToPayWithFee)
763767 }
764768 }
765769
766770
767771 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
768772 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
769773 if (if ((pType == SF_POOL))
770774 then true
771775 else (poolFB != ""))
772776 then {
773- let $t02316423376 = if ((poolFB == ""))
777+ let $t02336123573 = if ((poolFB == ""))
774778 then $Tuple3(balA, balB, pool)
775779 else {
776- let $t02327023343 = getSFPoolBalances(addressFromStringValue(poolFB))
777- let sfBalA = $t02327023343._1
778- let sfBalB = $t02327023343._2
780+ let $t02346723540 = getSFPoolBalances(addressFromStringValue(poolFB))
781+ let sfBalA = $t02346723540._1
782+ let sfBalB = $t02346723540._2
779783 $Tuple3(sfBalA, sfBalB, poolFB)
780784 }
781- let pBalA = $t02316423376._1
782- let pBalB = $t02316423376._2
783- let exPool = $t02316423376._3
784- let $t02338123507 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
785- let assetToPay = $t02338123507._1
786- let amountToPay = $t02338123507._2
785+ let pBalA = $t02336123573._1
786+ let pBalB = $t02336123573._2
787+ let exPool = $t02336123573._3
788+ let $t02357823704 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
789+ let assetToPay = $t02357823704._1
790+ let amountToPay = $t02357823704._2
787791 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
788792 }
789793 else if ((pType == WX_POOL))
790794 then {
791- let $t02370923831 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
792- let assetToPay = $t02370923831._1
793- let amountToPay = $t02370923831._2
795+ let $t02390624028 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
796+ let assetToPay = $t02390624028._1
797+ let amountToPay = $t02390624028._2
794798 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
795799 }
796800 else unknownPoolType()
797801 }
798802
799803
800804 func exchangeDirectlyNoLim (pType,pool,amountTokenEx,assetTokenToEx,assetTokenToGet) = {
801805 let balBefore = accountBalance(assetIdFromStr(assetTokenToGet))
802806 if ((balBefore == balBefore))
803807 then {
804808 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
805809 let inv = if (if ((pType == SF_POOL))
806810 then true
807811 else (poolFB != ""))
808812 then {
809813 let exPool = if ((poolFB == ""))
810814 then pool
811815 else poolFB
812816 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
813817 }
814818 else if ((pType == WX_POOL))
815819 then invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
816820 else unknownPoolType()
817821 if ((inv == inv))
818822 then {
819823 let balAfter = accountBalance(assetIdFromStr(assetTokenToGet))
820824 if ((balAfter == balAfter))
821825 then (balAfter - balBefore)
822826 else throw("Strict value is not equal to itself.")
823827 }
824828 else throw("Strict value is not equal to itself.")
825829 }
826830 else throw("Strict value is not equal to itself.")
827831 }
828832
829833
830834 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
831- let $t02496025431 = if ((pType == SF_POOL))
835+ let $t02515725628 = if ((pType == SF_POOL))
832836 then {
833837 let inv = {
834838 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
835839 if ($isInstanceOf(@, "List[Any]"))
836840 then @
837841 else throw(($getType(@) + " couldn't be cast to List[Any]"))
838842 }
839843 if ((inv == inv))
840844 then $Tuple2({
841845 let @ = inv[0]
842846 if ($isInstanceOf(@, "Int"))
843847 then @
844848 else throw(($getType(@) + " couldn't be cast to Int"))
845849 }, {
846850 let @ = inv[1]
847851 if ($isInstanceOf(@, "Int"))
848852 then @
849853 else throw(($getType(@) + " couldn't be cast to Int"))
850854 })
851855 else throw("Strict value is not equal to itself.")
852856 }
853857 else if ((pType == WX_POOL))
854858 then {
855859 let inv = split({
856860 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
857861 if ($isInstanceOf(@, "String"))
858862 then @
859863 else throw(($getType(@) + " couldn't be cast to String"))
860864 }, "__")
861865 if ((inv == inv))
862866 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
863867 else throw("Strict value is not equal to itself.")
864868 }
865869 else unknownPoolType()
866- let amountA = $t02496025431._1
867- let amountB = $t02496025431._2
870+ let amountA = $t02515725628._1
871+ let amountB = $t02515725628._2
868872 $Tuple2(amountA, amountB)
869873 }
870874
871875
872876 func claimFarmed (pType,pool) = {
873877 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
874878 if ((pType == SF_POOL))
875879 then {
876880 let balBefore = accountBalance(SWOPID)
877881 if ((balBefore == balBefore))
878882 then {
879883 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
880884 if ((inv == inv))
881885 then {
882886 let balAfter = accountBalance(SWOPID)
883887 $Tuple2((balAfter - balBefore), SWOPID)
884888 }
885889 else throw("Strict value is not equal to itself.")
886890 }
887891 else throw("Strict value is not equal to itself.")
888892 }
889893 else if ((pType == WX_POOL))
890894 then {
891- let $t02587125950 = getWXPoolData(addressFromStringValue(pool))
892- let aId = $t02587125950._1
893- let bId = $t02587125950._2
894- let aBal = $t02587125950._3
895- let bBal = $t02587125950._4
896- let lpId = $t02587125950._5
895+ let $t02606826147 = getWXPoolData(addressFromStringValue(pool))
896+ let aId = $t02606826147._1
897+ let bId = $t02606826147._2
898+ let aBal = $t02606826147._3
899+ let bBal = $t02606826147._4
900+ let lpId = $t02606826147._5
897901 let balBefore = accountBalance(WXID)
898902 if ((balBefore == balBefore))
899903 then {
900904 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
901905 let inv = if ((proxyAddr == ""))
902906 then invoke(farmAddr, "claimWx", [lpId], nil)
903907 else invoke(addressFromStringValue(proxyAddr), "wxClaimFarmed", [toString(farmAddr), lpId], nil)
904908 if ((inv == inv))
905909 then {
906910 let balAfter = accountBalance(WXID)
907911 $Tuple2((balAfter - balBefore), WXID)
908912 }
909913 else throw("Strict value is not equal to itself.")
910914 }
911915 else throw("Strict value is not equal to itself.")
912916 }
913917 else unknownPoolType()
914918 }
915919
916920
917921 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId,stakeMarket) = {
918922 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
919923 if ((lpBalanceBefore == lpBalanceBefore))
920924 then {
921925 let poolAddr = addressFromStringValue(pool)
922- let $t02675527183 = if (if ((pmtA > 0))
926+ let $t02695227380 = if (if ((pmtA > 0))
923927 then (pmtB > 0)
924928 else false)
925929 then {
926- let $t02682126943 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
927- let pmtInA = $t02682126943._1
928- let pmtInB = $t02682126943._2
929- let change = $t02682126943._3
930- let changeId = $t02682126943._4
930+ let $t02701827140 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
931+ let pmtInA = $t02701827140._1
932+ let pmtInB = $t02701827140._2
933+ let change = $t02701827140._3
934+ let changeId = $t02701827140._4
931935 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
932936 if ((inv == inv))
933937 then $Tuple2(change, changeId)
934938 else throw("Strict value is not equal to itself.")
935939 }
936940 else if ((pmtA > 0))
937941 then $Tuple2(pmtA, aId)
938942 else if ((pmtB > 0))
939943 then $Tuple2(pmtB, bId)
940944 else throw("pmts must be > 0")
941- let change = $t02675527183._1
942- let changeId = $t02675527183._2
945+ let change = $t02695227380._1
946+ let changeId = $t02695227380._2
943947 let inv = if ((change > 0))
944948 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
945949 else nil
946950 if ((inv == inv))
947951 then {
948952 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
949953 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
950954 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
951955 let userShareForStake = (totalStaked - axlyFeeAmount)
952956 if ((0 >= userShareForStake))
953957 then throw("amount of staked sharetokens must be > 0")
954958 else {
955959 let invLP = stakeLP(pool, pType, LPId, userShareForStake, stakeMarket)
956960 if ((invLP == invLP))
957961 then $Tuple2(userShareForStake, axlyFeeAmount)
958962 else throw("Strict value is not equal to itself.")
959963 }
960964 }
961965 else throw("Strict value is not equal to itself.")
962966 }
963967 else throw("Strict value is not equal to itself.")
964968 }
965969
966970
967971 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan,stakeToMarket) = {
968972 let totalAmount = getPoolTotalShare(pool)
969973 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
970974 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
971975 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
972976 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
973977 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
974978 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
975979 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
976- let $t02864429469 = if (withLoan)
980+ let $t02884129666 = if (withLoan)
977981 then if (stakeToMarket)
978982 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
979983 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
980984 else if (stakeToMarket)
981985 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
982986 else $Tuple2(poolInterestNoLoan, nil)
983- let curPoolInterest = $t02864429469._1
984- let adEntry = $t02864429469._2
987+ let curPoolInterest = $t02884129666._1
988+ let adEntry = $t02884129666._2
985989 ([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)
986990 }
987991
988992
989993 func listToInt (a,item) = (a :+ parseIntValue(item))
990994
991995
992996 func directSwopfiCPMM (rArgs,tokenTo) = {
993997 let dApp = addressFromStringValue(rArgs[1])
994998 let pmtP = split(rArgs[2], "|")
995999 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
9961000 if ((tokenBalanceBefore == tokenBalanceBefore))
9971001 then {
9981002 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
9991003 let minToRecive = rArgs[3]
10001004 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
10011005 if ((inv == inv))
10021006 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
10031007 else throw("Strict value is not equal to itself.")
10041008 }
10051009 else throw("Strict value is not equal to itself.")
10061010 }
10071011
10081012
10091013 func directRoutingSwopfi (rArgs,tokenTo) = {
10101014 let dApp = addressFromStringValue(rArgs[1])
10111015 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
10121016 if ((tokenBalanceBefore == tokenBalanceBefore))
10131017 then {
10141018 let pmt = {
10151019 let pmtP = split(rArgs[2], "|")
10161020 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
10171021 }
10181022 let args = {
10191023 let eArgs = split(rArgs[3], "|")
10201024 let exchangers = split(eArgs[0], ",")
10211025 let exchangersType = split(eArgs[1], ",")
10221026 let args1 = {
10231027 let $l = split(eArgs[2], ",")
10241028 let $s = size($l)
10251029 let $acc0 = nil
10261030 func $f0_1 ($a,$i) = if (($i >= $s))
10271031 then $a
10281032 else listToInt($a, $l[$i])
10291033
10301034 func $f0_2 ($a,$i) = if (($i >= $s))
10311035 then $a
10321036 else throw("List size exceeds 3")
10331037
10341038 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
10351039 }
10361040 let args2 = {
10371041 let $l = split(eArgs[3], ",")
10381042 let $s = size($l)
10391043 let $acc0 = nil
10401044 func $f1_1 ($a,$i) = if (($i >= $s))
10411045 then $a
10421046 else listToInt($a, $l[$i])
10431047
10441048 func $f1_2 ($a,$i) = if (($i >= $s))
10451049 then $a
10461050 else throw("List size exceeds 3")
10471051
10481052 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
10491053 }
10501054 let routingAssetsKeys = split(eArgs[4], ",")
10511055 let minToRecive = parseIntValue(eArgs[5])
10521056 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
10531057 }
10541058 let inv = invoke(dApp, "routingTrade", args, pmt)
10551059 if ((inv == inv))
10561060 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
10571061 else throw("Strict value is not equal to itself.")
10581062 }
10591063 else throw("Strict value is not equal to itself.")
10601064 }
10611065
10621066
10631067 func capitalize (pool,pType,tokenId,tokenAmount,AId,BId,balA,balB,shareId) = if (if ((tokenId != AId))
10641068 then (tokenId != BId)
10651069 else false)
10661070 then throw("Wrong asset")
10671071 else {
10681072 let totalShareAmount = getPoolTotalShare(pool)
10691073 if ((totalShareAmount == 0))
10701074 then $Tuple2([ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))], 0)
10711075 else {
10721076 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
10731077 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
10741078 if ((0 > ((totalShareAmount - totalMarketAmount) - totalShareAmountWithLoan)))
10751079 then throw("Error with share amount totalShareAmount < totalShareAmountWithLoan")
10761080 else {
10771081 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, (totalShareAmount - totalMarketAmount))
10781082 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
10791083 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
10801084 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10811085 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10821086 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
1083- let $t03254732647 = if ((tokenId == AId))
1087+ let $t03274432844 = if ((tokenId == AId))
10841088 then $Tuple2((tokenAmount - axlyFee), 0)
10851089 else $Tuple2(0, (tokenAmount - axlyFee))
1086- let pmtA = $t03254732647._1
1087- let pmtB = $t03254732647._2
1088- let $t03265032761 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1089- let stakedAmount = $t03265032761._1
1090- let nf = $t03265032761._2
1090+ let pmtA = $t03274432844._1
1091+ let pmtB = $t03274432844._2
1092+ let $t03284732958 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1093+ let stakedAmount = $t03284732958._1
1094+ let nf = $t03284732958._2
10911095 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10921096 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
10931097 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
10941098 let stakedNoLoan = (stakedAmount - stakedLoan)
10951099 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
10961100 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
10971101 else 0
10981102 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
10991103 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
11001104 else 0
11011105 $Tuple2([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))], stakedAmount)
11021106 }
11031107 }
11041108 }
11051109
11061110
11071111 func capitalizePuzzleMarket (pool,pType,shareId) = {
11081112 let totalShareAmount = getPoolTotalShare(pool)
11091113 let marketBalance = assetBalance(pMarketAddr, fromBase58String(shareId))
11101114 if ((marketBalance == marketBalance))
11111115 then {
11121116 let marketAvailable = {
11131117 let @ = invoke(pMarketRestAddr, "assetSupplyByAddressREADONLY", [toString(pMarketAddr), shareId, toString(this)], nil)
11141118 if ($isInstanceOf(@, "Int"))
11151119 then @
11161120 else throw(($getType(@) + " couldn't be cast to Int"))
11171121 }
11181122 if ((marketAvailable == marketAvailable))
11191123 then {
11201124 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
11211125 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
11221126 if (if ((totalMarketAmount == 0))
11231127 then (marketAvailable > 0)
11241128 else false)
11251129 then {
11261130 let unstakedAmount = unstakeLP(pool, pType, shareId, marketAvailable, true)
11271131 if ((unstakedAmount == unstakedAmount))
11281132 then if ((marketBalance > unstakedAmount))
11291133 then $Tuple2([ScriptTransfer(moneyBox, unstakedAmount, fromBase58String(shareId))], 0)
11301134 else $Tuple2(nil, 0)
11311135 else throw("Strict value is not equal to itself.")
11321136 }
11331137 else {
11341138 let capAmount = (marketAvailable - totalMarketAmount)
11351139 if ((0 >= capAmount))
11361140 then $Tuple2(nil, 0)
11371141 else {
11381142 let marketLoanPercent = fraction(totalMarketAmountWithLoan, SCALE8, totalMarketAmount)
11391143 let tokensMarketForFeeLoan = fraction(capAmount, marketLoanPercent, SCALE8)
11401144 let tokensMarketForForFeeNoLoan = (capAmount - tokensMarketForFeeLoan)
11411145 let axlyMarketFeeLoan = fraction(tokensMarketForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
11421146 let axlyMarketFeeNoLoan = fraction(tokensMarketForForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
11431147 let axlyMarketFee = (axlyMarketFeeLoan + axlyMarketFeeNoLoan)
11441148 if ((axlyMarketFee > marketBalance))
11451149 then $Tuple2(nil, 0)
11461150 else {
11471151 let stakedMarketAmount = (capAmount - axlyMarketFee)
11481152 let stakedMarketLoan = fraction(stakedMarketAmount, marketLoanPercent, SCALE8)
11491153 let stakedMarketNoLoan = (stakedMarketAmount - stakedMarketLoan)
11501154 let curPoolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
11511155 let curPoolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
11521156 let newInterestMarketLoan = if ((totalMarketAmountWithLoan > 0))
11531157 then (curPoolInterestMarketLoan + fraction(stakedMarketLoan, SCALE10, totalMarketAmountWithLoan))
11541158 else 0
11551159 let newInterestMarketNoLoan = if (((totalMarketAmount - totalMarketAmountWithLoan) > 0))
11561160 then (curPoolInterestMarketNoLoan + fraction(stakedMarketNoLoan, SCALE10, (totalMarketAmount - totalMarketAmountWithLoan)))
11571161 else 0
11581162 let unstakedAmount = unstakeLP(pool, pType, shareId, axlyMarketFee, true)
11591163 if ((unstakedAmount == unstakedAmount))
11601164 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)
11611165 else throw("Strict value is not equal to itself.")
11621166 }
11631167 }
11641168 }
11651169 }
11661170 else throw("Strict value is not equal to itself.")
11671171 }
11681172 else throw("Strict value is not equal to itself.")
11691173 }
11701174
11711175
11721176 func userCanWithdrawShareCalc (user,pool,posId,borrowed,isMarketPos) = {
11731177 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
11741178 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
11751179 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
11761180 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
11771181 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
11781182 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
11791183 let poolInterest = if (borrowed)
11801184 then if (isMarketPos)
11811185 then poolInterestMarketLoan
11821186 else poolInterestLoan
11831187 else if (isMarketPos)
11841188 then poolInterestMarketNoLoan
11851189 else poolInterestNoLoan
11861190 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
11871191 }
11881192
11891193
11901194 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
11911195 let feeType = if (isBorrowed)
11921196 then STOPLOSS_LOAN
11931197 else STOPLOSS_FEE_NO_LOAN
11941198 if (stopLoss)
11951199 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
11961200 else 0
11971201 }
11981202
11991203
12001204 func withdrawToUser (user,pool,posId,stopLoss,withdrawToken) = {
12011205 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
12021206 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
12031207 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
12041208 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed, fromMarket)
12051209 let poolTotalShare = getPoolTotalShare(pool)
12061210 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
12071211 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
12081212 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
12091213 let userAddr = Address(fromBase58String(user))
12101214 let poolAddr = Address(fromBase58String(pool))
12111215 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1212- let $t03881238884 = getPoolData(poolAddr, pType)
1213- let idAStr = $t03881238884._1
1214- let idBStr = $t03881238884._2
1215- let balA = $t03881238884._3
1216- let balB = $t03881238884._4
1217- let shareId = $t03881238884._5
1218- let $t03888738954 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1219- let idA = $t03888738954._1
1220- let idB = $t03888738954._2
1216+ let $t03901239084 = getPoolData(poolAddr, pType)
1217+ let idAStr = $t03901239084._1
1218+ let idBStr = $t03901239084._2
1219+ let balA = $t03901239084._3
1220+ let balB = $t03901239084._4
1221+ let shareId = $t03901239084._5
1222+ let $t03908739154 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1223+ let idA = $t03908739154._1
1224+ let idB = $t03908739154._2
12211225 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
12221226 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12231227 let cBalABefore = accountBalance(idA)
12241228 if ((cBalABefore == cBalABefore))
12251229 then {
12261230 let cBalBBefore = accountBalance(idB)
12271231 if ((cBalBBefore == cBalBBefore))
12281232 then {
12291233 let inv = if ((pType == SF_POOL))
12301234 then {
12311235 let inv = unstakeLP(pool, pType, shareId, stopLossFee, fromMarket)
12321236 if ((inv == inv))
12331237 then invoke(poolAddr, "callFunction", ["withdraw", [toString((userCanWithdraw - stopLossFee))]], nil)
12341238 else throw("Strict value is not equal to itself.")
12351239 }
12361240 else if ((pType == WX_POOL))
12371241 then {
12381242 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee), fromMarket)
12391243 if ((inv == inv))
12401244 then if ((proxyAddr == ""))
12411245 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12421246 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12431247 else throw("Strict value is not equal to itself.")
12441248 }
12451249 else unknownPoolType()
12461250 if ((inv == inv))
12471251 then {
12481252 let cBalAAfter = accountBalance(idA)
12491253 if ((cBalAAfter == cBalAAfter))
12501254 then {
12511255 let cBalBAfter = accountBalance(idB)
12521256 if ((cBalBAfter == cBalBAfter))
12531257 then {
1254- let $t03996240051 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1255- let tokensAmountA = $t03996240051._1
1256- let tokensAmountB = $t03996240051._2
1257- let $t04005441299 = if (isBorrowed)
1258+ let $t04016240251 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1259+ let tokensAmountA = $t04016240251._1
1260+ let tokensAmountB = $t04016240251._2
1261+ let $t04025441499 = if (isBorrowed)
12581262 then {
12591263 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12601264 let debt = {
12611265 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
12621266 if ($isInstanceOf(@, "Int"))
12631267 then @
12641268 else throw(($getType(@) + " couldn't be cast to Int"))
12651269 }
12661270 if ((debt == debt))
12671271 then {
12681272 let amountToGetEx = if (if ((borrowAsset == idAStr))
12691273 then (debt > tokensAmountA)
12701274 else false)
12711275 then (debt - tokensAmountA)
12721276 else if (if ((borrowAsset == idBStr))
12731277 then (debt > tokensAmountB)
12741278 else false)
12751279 then (debt - tokensAmountB)
12761280 else 0
12771281 let exInv = if ((amountToGetEx > 0))
12781282 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
12791283 else nil
12801284 if ((exInv == exInv))
12811285 then {
12821286 let cBalAAfterRepay = accountBalance(idA)
12831287 if ((cBalAAfterRepay == cBalAAfterRepay))
12841288 then {
12851289 let cBalBAfterRepay = accountBalance(idB)
12861290 if ((cBalBAfterRepay == cBalBAfterRepay))
12871291 then {
12881292 let closeDbtInv = if ((debt > 0))
12891293 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId), shareId], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
12901294 else 0
12911295 if ((closeDbtInv == closeDbtInv))
12921296 then if ((borrowAsset == idAStr))
12931297 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
12941298 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
12951299 else throw("Strict value is not equal to itself.")
12961300 }
12971301 else throw("Strict value is not equal to itself.")
12981302 }
12991303 else throw("Strict value is not equal to itself.")
13001304 }
13011305 else throw("Strict value is not equal to itself.")
13021306 }
13031307 else throw("Strict value is not equal to itself.")
13041308 }
13051309 else $Tuple2(tokensAmountA, tokensAmountB)
1306- let toUserA = $t04005441299._1
1307- let toUserB = $t04005441299._2
1310+ let toUserA = $t04025441499._1
1311+ let toUserB = $t04025441499._2
13081312 let poolTotalLoanEntries = if (isBorrowed)
13091313 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
13101314 else nil
13111315 let poolTotalMarketEntries = if (fromMarket)
13121316 then ([IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userCanWithdraw))] ++ (if (isBorrowed)
13131317 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
13141318 else nil))
13151319 else nil
1316- let $t04171242107 = if (if ((withdrawToken == idAStr))
1320+ let $t04191242307 = if (if ((withdrawToken == idAStr))
13171321 then (toUserB > 0)
13181322 else false)
13191323 then {
13201324 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserB, idBStr, idAStr)
13211325 if ((amtGet == amtGet))
13221326 then $Tuple2((toUserA + amtGet), 0)
13231327 else throw("Strict value is not equal to itself.")
13241328 }
13251329 else if (if ((withdrawToken == idBStr))
13261330 then (toUserA > 0)
13271331 else false)
13281332 then {
13291333 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserA, idAStr, idBStr)
13301334 if ((amtGet == amtGet))
13311335 then $Tuple2(0, (toUserB + amtGet))
13321336 else throw("Strict value is not equal to itself.")
13331337 }
13341338 else $Tuple2(toUserA, toUserB)
1335- let toUserACalc = $t04171242107._1
1336- let toUserBCalc = $t04171242107._2
1339+ let toUserACalc = $t04191242307._1
1340+ let toUserBCalc = $t04191242307._2
13371341 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))
13381342 $Tuple2(entries, [toUserACalc, toUserBCalc])
13391343 }
13401344 else throw("Strict value is not equal to itself.")
13411345 }
13421346 else throw("Strict value is not equal to itself.")
13431347 }
13441348 else throw("Strict value is not equal to itself.")
13451349 }
13461350 else throw("Strict value is not equal to itself.")
13471351 }
13481352 else throw("Strict value is not equal to itself.")
13491353 }
13501354
13511355
13521356 func liquidatePos (caller,user,posId,lAmount) = {
13531357 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13541358 let borrowAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), "There are no borrow position")
13551359 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
13561360 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
13571361 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, true, fromMarket)
13581362 let poolTotalShare = getPoolTotalShare(pool)
13591363 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
13601364 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
13611365 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
13621366 let userAddr = Address(fromBase58String(user))
13631367 let poolAddr = Address(fromBase58String(pool))
13641368 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1365- let $t04403244104 = getPoolData(poolAddr, pType)
1366- let idAStr = $t04403244104._1
1367- let idBStr = $t04403244104._2
1368- let balA = $t04403244104._3
1369- let balB = $t04403244104._4
1370- let shareId = $t04403244104._5
1371- let $t04410744174 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1372- let idA = $t04410744174._1
1373- let idB = $t04410744174._2
1369+ let $t04423244304 = getPoolData(poolAddr, pType)
1370+ let idAStr = $t04423244304._1
1371+ let idBStr = $t04423244304._2
1372+ let balA = $t04423244304._3
1373+ let balB = $t04423244304._4
1374+ let shareId = $t04423244304._5
1375+ let $t04430744374 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1376+ let idA = $t04430744374._1
1377+ let idB = $t04430744374._2
13741378 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
13751379 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13761380 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
13771381 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
13781382 if ((borrowAmount == 0))
13791383 then throw("You can't liquidate position without borrow")
13801384 else {
13811385 let cBalABefore = accountBalance(idA)
13821386 if ((cBalABefore == cBalABefore))
13831387 then {
13841388 let cBalBBefore = accountBalance(idB)
13851389 if ((cBalBBefore == cBalBBefore))
13861390 then {
13871391 let inv = if ((pType == SF_POOL))
13881392 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
13891393 else if ((pType == WX_POOL))
13901394 then {
13911395 let inv = unstakeLP(pool, pType, shareId, userCanWithdraw, fromMarket)
13921396 if ((inv == inv))
13931397 then if ((proxyAddr == ""))
13941398 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
13951399 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
13961400 else throw("Strict value is not equal to itself.")
13971401 }
13981402 else unknownPoolType()
13991403 if ((inv == inv))
14001404 then {
14011405 let cBalAAfter = accountBalance(idA)
14021406 if ((cBalAAfter == cBalAAfter))
14031407 then {
14041408 let cBalBAfter = accountBalance(idB)
14051409 if ((cBalBAfter == cBalBAfter))
14061410 then {
1407- let $t04535845447 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1408- let tokensAmountA = $t04535845447._1
1409- let tokensAmountB = $t04535845447._2
1411+ let $t04555845647 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1412+ let tokensAmountA = $t04555845647._1
1413+ let tokensAmountB = $t04555845647._2
14101414 let amountToGetEx = if (if ((borrowAsset == idAStr))
14111415 then (lAmount > tokensAmountA)
14121416 else false)
14131417 then (lAmount - tokensAmountA)
14141418 else if (if ((borrowAsset == idBStr))
14151419 then (lAmount > tokensAmountB)
14161420 else false)
14171421 then (lAmount - tokensAmountB)
14181422 else 0
14191423 let exInv = if ((amountToGetEx > 0))
14201424 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
14211425 else nil
14221426 if ((exInv == exInv))
14231427 then {
14241428 let cBalAAfterRepay = accountBalance(idA)
14251429 if ((cBalAAfterRepay == cBalAAfterRepay))
14261430 then {
14271431 let cBalBAfterRepay = accountBalance(idB)
14281432 if ((cBalBAfterRepay == cBalBAfterRepay))
14291433 then {
1430- let $t04595346180 = if ((borrowAsset == idAStr))
1434+ let $t04615346380 = if ((borrowAsset == idAStr))
14311435 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
14321436 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
1433- let toUserA = $t04595346180._1
1434- let toUserB = $t04595346180._2
1435- let $t04618346260 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1436- let balAAfter = $t04618346260._1
1437- let balBAfter = $t04618346260._2
1438- let $t04626346394 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1439- let userStaked = $t04626346394._1
1440- let axlyFee = $t04626346394._2
1437+ let toUserA = $t04615346380._1
1438+ let toUserB = $t04615346380._2
1439+ let $t04638346460 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1440+ let balAAfter = $t04638346460._1
1441+ let balBAfter = $t04638346460._2
1442+ let $t04646346594 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1443+ let userStaked = $t04646346594._1
1444+ let axlyFee = $t04646346594._2
14411445 let userLpLiqudated = (userCanWithdraw - userStaked)
1442- let $t04645346798 = if (fromMarket)
1446+ let $t04665346998 = if (fromMarket)
14431447 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
14441448 else $Tuple2(poolInterestLoan, nil)
1445- let curPoolInterest = $t04645346798._1
1446- let poolTotalMarketEntries = $t04645346798._2
1449+ let curPoolInterest = $t04665346998._1
1450+ let poolTotalMarketEntries = $t04665346998._2
14471451 $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)
14481452 }
14491453 else throw("Strict value is not equal to itself.")
14501454 }
14511455 else throw("Strict value is not equal to itself.")
14521456 }
14531457 else throw("Strict value is not equal to itself.")
14541458 }
14551459 else throw("Strict value is not equal to itself.")
14561460 }
14571461 else throw("Strict value is not equal to itself.")
14581462 }
14591463 else throw("Strict value is not equal to itself.")
14601464 }
14611465 else throw("Strict value is not equal to itself.")
14621466 }
14631467 else throw("Strict value is not equal to itself.")
14641468 }
14651469 }
14661470
14671471
14681472 func parseRequest (requestId) = {
14691473 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
14701474 let user = request[0]
14711475 let pool = request[1]
14721476 let pmtA = parseIntValue(request[2])
14731477 let AId = request[3]
14741478 let pmtB = parseIntValue(request[4])
14751479 let BId = request[5]
14761480 let balA = parseIntValue(request[6])
14771481 let balB = parseIntValue(request[7])
14781482 let shareId = request[8]
14791483 let bwAsset = request[9]
14801484 let bwAmount = parseIntValue(request[10])
14811485 let stakeToMarket = (request[11] == "true")
14821486 $Tuple12(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount, stakeToMarket)
14831487 }
14841488
14851489
14861490 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
14871491 then (borrowId != bId)
14881492 else false)
14891493 then throw("Wrong borrow asset")
14901494 else {
14911495 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
14921496 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
14931497 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
14941498 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
14951499 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1496- let $t04852648623 = if ((borrowId == aId))
1500+ let $t04872648823 = if ((borrowId == aId))
14971501 then $Tuple2(dPriceA, decPrA)
14981502 else $Tuple2(dPriceB, decPrB)
1499- let borrowPrice = $t04852648623._1
1500- let borrowDecPr = $t04852648623._2
1503+ let borrowPrice = $t04872648823._1
1504+ let borrowDecPr = $t04872648823._2
15011505 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
15021506 }
15031507
15041508
15051509 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
15061510 then if ((assetIdToStr(pmts[0].assetId) != AId))
15071511 then throw("Wrong payment asset A")
15081512 else if ((assetIdToStr(pmts[1].assetId) != BId))
15091513 then throw("Wrong payment asset B")
15101514 else $Tuple2(pmts[0].amount, pmts[1].amount)
15111515 else if ((size(pmts) == 1))
15121516 then if ((assetIdToStr(pmts[0].assetId) == AId))
15131517 then $Tuple2(pmts[0].amount, 0)
15141518 else if ((assetIdToStr(pmts[0].assetId) == BId))
15151519 then $Tuple2(0, pmts[0].amount)
15161520 else throw("Wrong payment")
15171521 else throw("One or two payments expected")
15181522
15191523
15201524 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
15211525 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
15221526 if ((0 > pri))
15231527 then (pri * -1)
15241528 else pri
15251529 }
15261530
15271531
15281532 func claimAndCheckAmnt (pool,pType,claim,amountToExchange,amountFromBalance) = {
1529- let $t04964450495 = if (claim)
1533+ let $t04984450695 = if (claim)
15301534 then {
15311535 let claimed = claimFarmed(pType, pool)
15321536 if ((amountToExchange > 0))
15331537 then $Tuple2(amountToExchange, claimed._2)
15341538 else $Tuple2((claimed._1 + amountFromBalance), claimed._2)
15351539 }
15361540 else {
15371541 let claimedAsset = if ((pType == SF_POOL))
15381542 then SWOPID
15391543 else if ((pType == WX_POOL))
15401544 then {
15411545 let proxyAddrStr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
15421546 let inv = if ((proxyAddrStr != ""))
15431547 then {
15441548 let proxyAddr = addressFromStringValue(proxyAddrStr)
15451549 let proxyBalance = assetBalance(proxyAddr, WXID)
15461550 if ((proxyBalance > 0))
15471551 then invoke(proxyAddr, "wxClaimFinalized", [proxyBalance], nil)
15481552 else unit
15491553 }
15501554 else unit
15511555 if ((inv == inv))
15521556 then WXID
15531557 else throw("Strict value is not equal to itself.")
15541558 }
15551559 else unknownPoolType()
15561560 $Tuple2((amountToExchange + amountFromBalance), claimedAsset)
15571561 }
1558- if (($t04964450495 == $t04964450495))
1562+ if (($t04984450695 == $t04984450695))
15591563 then {
1560- let asset = $t04964450495._2
1561- let amount = $t04964450495._1
1564+ let asset = $t04984450695._2
1565+ let amount = $t04984450695._1
15621566 let bal = accountBalance(asset)
15631567 if ((bal == bal))
15641568 then if ((amount > bal))
15651569 then throw("To big amount to exchange")
15661570 else $Tuple2(amount, asset)
15671571 else throw("Strict value is not equal to itself.")
15681572 }
15691573 else throw("Strict value is not equal to itself.")
15701574 }
15711575
15721576
15731577 @Callable(i)
15741578 func getPoolInfoREADONLY (pool) = {
15751579 let poolAddr = addressFromStringValue(pool)
15761580 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1577- let $t05084750937 = getPoolData(Address(fromBase58String(pool)), pType)
1578- let AId = $t05084750937._1
1579- let BId = $t05084750937._2
1580- let balA = $t05084750937._3
1581- let balB = $t05084750937._4
1582- let shareId = $t05084750937._5
1581+ let $t05104751137 = getPoolData(Address(fromBase58String(pool)), pType)
1582+ let AId = $t05104751137._1
1583+ let BId = $t05104751137._2
1584+ let balA = $t05104751137._3
1585+ let balB = $t05104751137._4
1586+ let shareId = $t05104751137._5
15831587 let shareSupply = getShareSupply(poolAddr, pType, shareId)
15841588 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
15851589 }
15861590
15871591
15881592
15891593 @Callable(i)
15901594 func getShareAssetPriceREADONLY (shareId) = {
15911595 let sharePrices = getSharePrice(shareId)
15921596 $Tuple2(nil, sharePrices)
15931597 }
15941598
15951599
15961600
15971601 @Callable(i)
15981602 func getUserPositionShareAmountREADONLY (user,posNum) = {
15991603 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
16001604 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
16011605 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum) + kUserPositionInPMarket)), false)
16021606 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0), fromMarket)
16031607 $Tuple2(nil, userCanWithdraw)
16041608 }
16051609
16061610
16071611
16081612 @Callable(i)
16091613 func getUserPositionREADONLY (user,pools,posNum) = {
16101614 func userPos (a,pool) = {
1611- let $t05193552005 = a
1612- let wAmountsA = $t05193552005._1
1613- let wAmountsB = $t05193552005._2
1614- let debts = $t05193552005._3
1615- let eqWAmountsA = $t05193552005._4
1616- let eqWAmountsB = $t05193552005._5
1617- let index = $t05193552005._6
1615+ let $t05213552205 = a
1616+ let wAmountsA = $t05213552205._1
1617+ let wAmountsB = $t05213552205._2
1618+ let debts = $t05213552205._3
1619+ let eqWAmountsA = $t05213552205._4
1620+ let eqWAmountsB = $t05213552205._5
1621+ let index = $t05213552205._6
16181622 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
16191623 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
16201624 else {
16211625 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1622- let $t05228452374 = getPoolData(Address(fromBase58String(pool)), pType)
1623- let AId = $t05228452374._1
1624- let BId = $t05228452374._2
1625- let balA = $t05228452374._3
1626- let balB = $t05228452374._4
1627- let shareId = $t05228452374._5
1626+ let $t05248452574 = getPoolData(Address(fromBase58String(pool)), pType)
1627+ let AId = $t05248452574._1
1628+ let BId = $t05248452574._2
1629+ let balA = $t05248452574._3
1630+ let balB = $t05248452574._4
1631+ let shareId = $t05248452574._5
16281632 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
16291633 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
16301634 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1631- let $t05272452844 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1632- let wAmountA = $t05272452844._1
1633- let wAmountB = $t05272452844._2
1635+ let $t05292453044 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1636+ let wAmountA = $t05292453044._1
1637+ let wAmountB = $t05292453044._2
16341638 if ((borrowAmount > 0))
16351639 then {
16361640 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
16371641 let debt = {
16381642 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
16391643 if ($isInstanceOf(@, "Int"))
16401644 then @
16411645 else throw(($getType(@) + " couldn't be cast to Int"))
16421646 }
16431647 if ((debt == debt))
16441648 then {
16451649 let amountToGetEx = if (if ((borrowAsset == AId))
16461650 then (debt > wAmountA)
16471651 else false)
16481652 then (debt - wAmountA)
16491653 else if (if ((borrowAsset == BId))
16501654 then (debt > wAmountB)
16511655 else false)
16521656 then (debt - wAmountB)
16531657 else 0
16541658 let amountToPay = if ((amountToGetEx > 0))
16551659 then if ((pType == SF_POOL))
16561660 then {
16571661 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
16581662 ex._2
16591663 }
16601664 else if ((pType == WX_POOL))
16611665 then {
16621666 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
16631667 ex._2
16641668 }
16651669 else unknownPoolType()
16661670 else 0
1667- let $t05375653975 = if ((borrowAsset == AId))
1671+ let $t05395654175 = if ((borrowAsset == AId))
16681672 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
16691673 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1670- let eqWAmountA = $t05375653975._1
1671- let eqWAmountB = $t05375653975._2
1674+ let eqWAmountA = $t05395654175._1
1675+ let eqWAmountB = $t05395654175._2
16721676 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
16731677 }
16741678 else throw("Strict value is not equal to itself.")
16751679 }
16761680 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
16771681 }
16781682 }
16791683
1680- let $t05423054341 = {
1684+ let $t05443054541 = {
16811685 let $l = pools
16821686 let $s = size($l)
16831687 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
16841688 func $f0_1 ($a,$i) = if (($i >= $s))
16851689 then $a
16861690 else userPos($a, $l[$i])
16871691
16881692 func $f0_2 ($a,$i) = if (($i >= $s))
16891693 then $a
16901694 else throw("List size exceeds 20")
16911695
16921696 $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)
16931697 }
1694- let wAmountsA = $t05423054341._1
1695- let wAmountsB = $t05423054341._2
1696- let debts = $t05423054341._3
1697- let eqWAmountsA = $t05423054341._4
1698- let eqWAmountsB = $t05423054341._5
1698+ let wAmountsA = $t05443054541._1
1699+ let wAmountsB = $t05443054541._2
1700+ let debts = $t05443054541._3
1701+ let eqWAmountsA = $t05443054541._4
1702+ let eqWAmountsB = $t05443054541._5
16991703 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
17001704 }
17011705
17021706
17031707
17041708 @Callable(i)
17051709 func replenish (pool,leverage,borrowId,stakeToMarket) = valueOrElse(isActiveForUsers(), {
17061710 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
17071711 let allowedBAssets = valueOrElse(getString(this, (pool + kPoolAllowedBorrowAssets)), "")
17081712 if (!(isPoolActive(pool, pType)))
17091713 then throw("Pool not active at this moment")
17101714 else if (if ((100 > leverage))
17111715 then true
17121716 else (leverage > 300))
17131717 then throw("Leverage can't be <100 and >300")
17141718 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
17151719 then (leverage > 100)
17161720 else false)
17171721 then throw("You can't borrow in this pool")
17181722 else if (if (if ((leverage > 100))
17191723 then (allowedBAssets != "")
17201724 else false)
17211725 then !(containsElement(split(allowedBAssets, ","), borrowId))
17221726 else false)
17231727 then throw("You can't borrow this asset")
17241728 else if (if (stakeToMarket)
17251729 then !(valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false))
17261730 else false)
17271731 then throw("This pool can't stake to puzzle market")
17281732 else {
1729- let $t05533455424 = getPoolData(Address(fromBase58String(pool)), pType)
1730- let AId = $t05533455424._1
1731- let BId = $t05533455424._2
1732- let balA = $t05533455424._3
1733- let balB = $t05533455424._4
1734- let shareId = $t05533455424._5
1733+ let $t05553455624 = getPoolData(Address(fromBase58String(pool)), pType)
1734+ let AId = $t05553455624._1
1735+ let BId = $t05553455624._2
1736+ let balA = $t05553455624._3
1737+ let balB = $t05553455624._4
1738+ let shareId = $t05553455624._5
17351739 if (if ((borrowId != AId))
17361740 then (borrowId != BId)
17371741 else false)
17381742 then throw("Wrong borrow asset")
17391743 else {
1740- let $t05550555564 = parseReplenishPmts(i.payments, AId, BId)
1741- let pmtA = $t05550555564._1
1742- let pmtB = $t05550555564._2
1744+ let $t05570555764 = parseReplenishPmts(i.payments, AId, BId)
1745+ let pmtA = $t05570555764._1
1746+ let pmtB = $t05570555764._2
17431747 let user = toString(i.caller)
17441748 let newPosNum = getNewUserPositionNumber(user)
17451749 if ((leverage > 100))
17461750 then {
17471751 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
17481752 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
17491753 let newRequestId = {
17501754 let @ = invoke(this, "createNewRequest", [request], nil)
17511755 if ($isInstanceOf(@, "Int"))
17521756 then @
17531757 else throw(($getType(@) + " couldn't be cast to Int"))
17541758 }
17551759 if ((newRequestId == newRequestId))
17561760 then {
17571761 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
17581762 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
17591763 if ((inv == inv))
17601764 then {
17611765 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1762- let $t05658756681 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1763- if (($t05658756681 == $t05658756681))
1766+ let $t05678756881 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1767+ if (($t05678756881 == $t05678756881))
17641768 then {
1765- let newBalB = $t05658756681._2
1766- let newBalA = $t05658756681._1
1769+ let newBalB = $t05678756881._2
1770+ let newBalA = $t05678756881._1
17671771 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1768- let $t05675156866 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1769- let wAmountA = $t05675156866._1
1770- let wAmountB = $t05675156866._2
1772+ let $t05695157066 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1773+ let wAmountA = $t05695157066._1
1774+ let wAmountB = $t05695157066._2
17711775 let futureBorrowApy = invoke(getLendSrvAddr(), "calculateTokenInterest", [borrowId, false], nil)
17721776 if ((futureBorrowApy == futureBorrowApy))
17731777 then $Tuple2(nil, [prImpact, wAmountA, wAmountB, futureBorrowApy])
17741778 else throw("Strict value is not equal to itself.")
17751779 }
17761780 else throw("Strict value is not equal to itself.")
17771781 }
17781782 else throw("Strict value is not equal to itself.")
17791783 }
17801784 else throw("Strict value is not equal to itself.")
17811785 }
17821786 else {
1783- let $t05703857168 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1784- if (($t05703857168 == $t05703857168))
1787+ let $t05723857368 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1788+ if (($t05723857368 == $t05723857368))
17851789 then {
1786- let axlyFee = $t05703857168._2
1787- let userStaked = $t05703857168._1
1788- let $t05717457268 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1789- if (($t05717457268 == $t05717457268))
1790+ let axlyFee = $t05723857368._2
1791+ let userStaked = $t05723857368._1
1792+ let $t05737457468 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1793+ if (($t05737457468 == $t05737457468))
17901794 then {
1791- let newBalB = $t05717457268._2
1792- let newBalA = $t05717457268._1
1795+ let newBalB = $t05737457468._2
1796+ let newBalA = $t05737457468._1
17931797 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1794- let $t05733857453 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1795- let wAmountA = $t05733857453._1
1796- let wAmountB = $t05733857453._2
1798+ let $t05753857653 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1799+ let wAmountA = $t05753857653._1
1800+ let wAmountB = $t05753857653._2
17971801 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB, 0])
17981802 }
17991803 else throw("Strict value is not equal to itself.")
18001804 }
18011805 else throw("Strict value is not equal to itself.")
18021806 }
18031807 }
18041808 }
18051809 })
18061810
18071811
18081812
18091813 @Callable(i)
18101814 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
18111815 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
18121816 if (!(isPoolActive(pool, pType)))
18131817 then throw("Pool not active at this moment")
18141818 else withdrawToUser(toString(i.caller), pool, toString(posId), false, "")
18151819 })
18161820
18171821
18181822
18191823 @Callable(i)
18201824 func withdrawOneToken (pool,posId,tokenId) = valueOrElse(isActiveForUsers(), {
18211825 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
18221826 if (!(isPoolActive(pool, pType)))
18231827 then throw("Pool not active at this moment")
18241828 else withdrawToUser(toString(i.caller), pool, toString(posId), false, tokenId)
18251829 })
18261830
18271831
18281832
18291833 @Callable(i)
18301834 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
18311835 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
18321836 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
18331837 if (!(isPoolActive(poolId, pType)))
18341838 then throw("Pool not active at this moment")
18351839 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
18361840 then throw("There are no user position")
18371841 else if ((0 >= price))
18381842 then throw("Price must be greater than 0")
18391843 else if ((price > tokenOraclePrice))
18401844 then throw("Price must be less than current token price")
18411845 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
18421846 })
18431847
18441848
18451849
18461850 @Callable(i)
18471851 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
18481852 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
18491853 if (!(isPoolActive(poolId, pType)))
18501854 then throw("Pool not active at this moment")
18511855 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
18521856 then throw("No entry")
18531857 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
18541858 })
18551859
18561860
18571861
18581862 @Callable(i)
18591863 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
18601864 then throw("Already inited")
18611865 else if (!(isDefined(addressFromString(moneyBoxAddr))))
18621866 then throw("moneyBoxAddr is not correct address")
18631867 else if (!(isDefined(addressFromString(sfFarmingAddr))))
18641868 then throw("sfFarmingAddr is not correct address")
18651869 else if (!(isDefined(addressFromString(lendAddr))))
18661870 then throw("lendAddr is not correct address")
18671871 else if (!(isDefined(addressFromString(priceOracleAddr))))
18681872 then throw("priceOracleAddr is not correct address")
18691873 else if (!(isDefined(addressFromString(keeperExContract))))
18701874 then throw("keeperExContract is not correct address")
18711875 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
18721876 then throw("swopAssetId is not correct asset id")
18731877 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
18741878 then throw("swopAssetId is not correct asset id")
18751879 else if ((size(fromBase58String(operatorPubKey)) != 32))
18761880 then throw("operatorPubKey is not correct")
18771881 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
18781882 then throw("group1Admin1PubKey is not correct")
18791883 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
18801884 then throw("group1Admin2PubKey is not correct")
18811885 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
18821886 then throw("group2Admin1PubKey is not correct")
18831887 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
18841888 then throw("group2Admin2PubKey is not correct")
18851889 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)])
18861890
18871891
18881892
18891893 @Callable(i)
18901894 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
18911895 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
18921896 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
18931897 })
18941898
18951899
18961900
18971901 @Callable(i)
18981902 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1899- let $t06267662795 = parseRequest(requestId)
1900- let user = $t06267662795._1
1901- let pool = $t06267662795._2
1902- let pmtA = $t06267662795._3
1903- let AId = $t06267662795._4
1904- let pmtB = $t06267662795._5
1905- let BId = $t06267662795._6
1906- let balA = $t06267662795._7
1907- let balB = $t06267662795._8
1908- let shareId = $t06267662795._9
1909- let bwAsset = $t06267662795._10
1910- let bwAmount = $t06267662795._11
1911- let stakeToMarket = $t06267662795._12
1903+ let $t06287662995 = parseRequest(requestId)
1904+ let user = $t06287662995._1
1905+ let pool = $t06287662995._2
1906+ let pmtA = $t06287662995._3
1907+ let AId = $t06287662995._4
1908+ let pmtB = $t06287662995._5
1909+ let BId = $t06287662995._6
1910+ let balA = $t06287662995._7
1911+ let balB = $t06287662995._8
1912+ let shareId = $t06287662995._9
1913+ let bwAsset = $t06287662995._10
1914+ let bwAmount = $t06287662995._11
1915+ let stakeToMarket = $t06287662995._12
19121916 if ((size(i.payments) != 1))
19131917 then throw("Wrong payment size")
19141918 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
19151919 then true
19161920 else (i.payments[0].amount != bwAmount))
19171921 then throw("Wrong payment")
19181922 else {
1919- let $t06298563085 = if ((AId == bwAsset))
1923+ let $t06318563285 = if ((AId == bwAsset))
19201924 then $Tuple2((pmtA + bwAmount), pmtB)
19211925 else $Tuple2(pmtA, (pmtB + bwAmount))
1922- let pmtAllA = $t06298563085._1
1923- let pmtAllB = $t06298563085._2
1926+ let pmtAllA = $t06318563285._1
1927+ let pmtAllB = $t06318563285._2
19241928 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1925- let $t06316763297 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1926- let userStaked = $t06316763297._1
1927- let axlyFee = $t06316763297._2
1929+ let $t06336763497 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1930+ let userStaked = $t06336763497._1
1931+ let axlyFee = $t06336763497._2
19281932 let posNum = getNewUserPositionNumber(user)
19291933 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
19301934 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1931- let $t06367263787 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1932- let wAmountA = $t06367263787._1
1933- let wAmountB = $t06367263787._2
1935+ let $t06387263987 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1936+ let wAmountA = $t06387263987._1
1937+ let wAmountB = $t06387263987._2
19341938 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
19351939 }
19361940 }))
19371941
19381942
19391943
19401944 @Callable(i)
19411945 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), liquidatePos(i.caller, user, posId, liquidateAmount)))
19421946
19431947
19441948
19451949 @Callable(i)
19461950 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19471951 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
19481952 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
19491953 if ((tokenOraclePrice > stopLossPrice))
19501954 then throw("Token price greater stop loss price")
19511955 else {
19521956 let res = withdrawToUser(user, pool, toString(posId), true, "")
19531957 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
19541958 }
19551959 }))
19561960
19571961
19581962
19591963 @Callable(i)
19601964 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19611965 let pType = getStringValue(this, (kPool + pool))
19621966 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
19631967 let poolAddr = Address(fromBase58String(pool))
1964- let $t06520365269 = getPoolData(poolAddr, pType)
1965- let AId = $t06520365269._1
1966- let BId = $t06520365269._2
1967- let balA = $t06520365269._3
1968- let balB = $t06520365269._4
1969- let shareId = $t06520365269._5
1968+ let $t06540365469 = getPoolData(poolAddr, pType)
1969+ let AId = $t06540365469._1
1970+ let BId = $t06540365469._2
1971+ let balA = $t06540365469._3
1972+ let balB = $t06540365469._4
1973+ let shareId = $t06540365469._5
19701974 let totalShareAmount = getPoolTotalShare(pool)
19711975 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1972- let $t06539866224 = if ((amountToExchange > 0))
1976+ let $t06559866424 = if ((amountToExchange > 0))
19731977 then {
1974- let $t06546065557 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1975- if (($t06546065557 == $t06546065557))
1978+ let $t06566065757 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1979+ if (($t06566065757 == $t06566065757))
19761980 then {
1977- let claimedAsset = $t06546065557._2
1978- let claimedAmount = $t06546065557._1
1981+ let claimedAsset = $t06566065757._2
1982+ let claimedAmount = $t06566065757._1
19791983 let rArgs = split(route, "__")
19801984 let exchangedAmount = if ((amountToExchange > 0))
19811985 then if ((rArgs[0] == "directSwopfiCPMM"))
19821986 then directSwopfiCPMM(rArgs, tokenToId)
19831987 else if ((rArgs[0] == "routingSwopfi"))
19841988 then directRoutingSwopfi(rArgs, tokenToId)
19851989 else throw("Wrong route")
19861990 else 0
19871991 if ((exchangedAmount == exchangedAmount))
19881992 then {
19891993 let newChange = ((claimedAmount + change) - amountToExchange)
19901994 let changeEntry = if ((newChange >= 0))
19911995 then [IntegerEntry((pool + kPoolCapChange), newChange)]
19921996 else nil
1993- let $t06605466164 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1994- let capEnterise = $t06605466164._1
1995- let staked = $t06605466164._2
1997+ let $t06625466364 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1998+ let capEnterise = $t06625466364._1
1999+ let staked = $t06625466364._2
19962000 $Tuple2((capEnterise ++ changeEntry), staked)
19972001 }
19982002 else throw("Strict value is not equal to itself.")
19992003 }
20002004 else throw("Strict value is not equal to itself.")
20012005 }
20022006 else $Tuple2(nil, 0)
2003- let capEnterise = $t06539866224._1
2004- let staked = $t06539866224._2
2005- let $t06622766344 = if (isMarketPool)
2007+ let capEnterise = $t06559866424._1
2008+ let staked = $t06559866424._2
2009+ let $t06642766544 = if (isMarketPool)
20062010 then capitalizePuzzleMarket(pool, pType, shareId)
20072011 else $Tuple2(nil, 0)
2008- let marketCapEnteris = $t06622766344._1
2009- let stakedMarket = $t06622766344._2
2012+ let marketCapEnteris = $t06642766544._1
2013+ let stakedMarket = $t06642766544._2
20102014 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
20112015 }))
20122016
20132017
20142018
20152019 @Callable(i)
20162020 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
20172021 let pType = getStringValue(this, (kPool + pool))
20182022 let poolAddr = Address(fromBase58String(pool))
2019- let $t06677966845 = getPoolData(poolAddr, pType)
2020- let AId = $t06677966845._1
2021- let BId = $t06677966845._2
2022- let balA = $t06677966845._3
2023- let balB = $t06677966845._4
2024- let shareId = $t06677966845._5
2023+ let $t06697967045 = getPoolData(poolAddr, pType)
2024+ let AId = $t06697967045._1
2025+ let BId = $t06697967045._2
2026+ let balA = $t06697967045._3
2027+ let balB = $t06697967045._4
2028+ let shareId = $t06697967045._5
20252029 let totalShareAmount = getPoolTotalShare(pool)
2026- let $t06689766995 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2027- if (($t06689766995 == $t06689766995))
2030+ let $t06709767195 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2031+ if (($t06709767195 == $t06709767195))
20282032 then {
2029- let claimedAsset = $t06689766995._2
2030- let claimedAmount = $t06689766995._1
2031- let $t06699867124 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2032- let capEnterise = $t06699867124._1
2033- let staked = $t06699867124._2
2033+ let claimedAsset = $t06709767195._2
2034+ let claimedAmount = $t06709767195._1
2035+ let $t06719867324 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2036+ let capEnterise = $t06719867324._1
2037+ let staked = $t06719867324._2
20342038 (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
20352039 }
20362040 else throw("Strict value is not equal to itself.")
20372041 }))
20382042
20392043
20402044
20412045 @Callable(i)
20422046 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow,canPMarket,allowedBorrowAssets) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
20432047 then (type != WX_POOL)
20442048 else false)
20452049 then throw("Wrong type")
20462050 else if (if ((poolType != CPMM))
20472051 then (poolType != FLAT)
20482052 else false)
20492053 then throw("Wrong pool type")
20502054 else {
2051- let $t06777867872 = getPoolData(Address(fromBase58String(poolAddr)), type)
2052- let aId = $t06777867872._1
2053- let bId = $t06777867872._2
2054- let aBal = $t06777867872._3
2055- let bBal = $t06777867872._4
2056- let shareId = $t06777867872._5
2055+ let $t06797868072 = getPoolData(Address(fromBase58String(poolAddr)), type)
2056+ let aId = $t06797868072._1
2057+ let bId = $t06797868072._2
2058+ let aBal = $t06797868072._3
2059+ let bBal = $t06797868072._4
2060+ let shareId = $t06797868072._5
20572061 if ((0 > inFeeNoLoan))
20582062 then throw("inFeeNoLoan must be greater than 0")
20592063 else if ((0 > inFeeLoan))
20602064 then throw("inFeeLoan must be greater than 0")
20612065 else if ((0 > capFeeNoLoan))
20622066 then throw("capFeeNoLoan must be greater than 0")
20632067 else if ((0 > capFeeWithLoan))
20642068 then throw("capFeeWithLoan must be greater than 0")
20652069 else if ((0 > stoplossFeeNoLoan))
20662070 then throw("stoplossFeeNoLoan must be greater than 0")
20672071 else if ((0 > stoplossFeeWithLoan))
20682072 then throw("stoplossFeeWithLoan must be greater than 0")
20692073 else {
20702074 let allowedBorrowAssetsEntry = if ((allowedBorrowAssets != ""))
20712075 then [StringEntry((poolAddr + kPoolAllowedBorrowAssets), allowedBorrowAssets)]
20722076 else nil
20732077 ([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)
20742078 }
20752079 }))
20762080
20772081
20782082
20792083 @Callable(i)
20802084 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
20812085 then throw(("Can't find pool with addr " + poolAddr))
20822086 else if ((0 > inFeeNoLoan))
20832087 then throw("inFeeNoLoan must be greater than 0")
20842088 else if ((0 > inFeeLoan))
20852089 then throw("inFeeLoan must be greater than 0")
20862090 else if ((0 > capFeeNoLoan))
20872091 then throw("capFeeNoLoan must be greater than 0")
20882092 else if ((0 > capFeeWithLoan))
20892093 then throw("capFeeWithLoan must be greater than 0")
20902094 else if ((0 > stoplossFeeNoLoan))
20912095 then throw("stoplossFeeNoLoan must be greater than 0")
20922096 else if ((0 > stoplossFeeWithLoan))
20932097 then throw("stoplossFeeWithLoan must be greater than 0")
20942098 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)]))
20952099
20962100
20972101
20982102 @Callable(i)
20992103 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
21002104 then throw("dApp already active")
21012105 else [BooleanEntry(kActive, true)])
21022106
21032107
21042108
21052109 @Callable(i)
21062110 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
21072111 then throw("dApp already shutdown")
21082112 else [BooleanEntry(kActive, false)])
21092113
21102114
21112115
21122116 @Callable(i)
21132117 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
21142118 then throw("dApp already active for users")
21152119 else [BooleanEntry(kActiveUsers, true)])
21162120
21172121
21182122
21192123 @Callable(i)
21202124 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
21212125 then throw("dApp already shutdown for users")
21222126 else [BooleanEntry(kActiveUsers, false)])
21232127
21242128
21252129
21262130 @Callable(i)
21272131 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
21282132 then throw("SWOPFI already active")
21292133 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
21302134
21312135
21322136
21332137 @Callable(i)
21342138 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
21352139 then throw("SWOPFI already shutdown")
21362140 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
21372141
21382142
21392143
21402144 @Callable(i)
21412145 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
21422146 then throw("WX already active")
21432147 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
21442148
21452149
21462150
21472151 @Callable(i)
21482152 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
21492153 then throw("WX already shutdown")
21502154 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
21512155
21522156
21532157
21542158 @Callable(i)
21552159 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
21562160 then throw("Unknown pool")
21572161 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
21582162 then throw("Pool already active")
21592163 else [BooleanEntry((pool + kPoolActive), true)])
21602164
21612165
21622166
21632167 @Callable(i)
21642168 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
21652169 then throw("Unknown pool")
21662170 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
21672171 then throw("Pool already shutdown")
21682172 else [BooleanEntry((pool + kPoolActive), false)])
21692173
21702174
21712175 @Verifier(tx)
21722176 func verify () = {
21732177 let multiSignedByAdmins = {
21742178 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
21752179 then 1
21762180 else 0
21772181 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group1Admin2PK))
21782182 then 1
21792183 else 0
21802184 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], group1Admin3PK))
21812185 then 1
21822186 else 0
21832187 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
21842188 }
21852189 multiSignedByAdmins
21862190 }
21872191

github/deemru/w8io/3ef1775 
315.05 ms