tx · CUiARNrn5WceECGMy34NycbZ3AfeBxHLYWXWzM8bYR5u

3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS:  -0.53000000 Waves

2023.10.18 12:13 [2803849] smart account 3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS > SELF 0.00000000 Waves

{ "type": 13, "id": "CUiARNrn5WceECGMy34NycbZ3AfeBxHLYWXWzM8bYR5u", "fee": 53000000, "feeAssetId": null, "timestamp": 1697620408674, "version": 2, "chainId": 84, "sender": "3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS", "senderPublicKey": "HP8sssVq1866F7CaPQJwgFrt6fsqhQjKwM84cL1wjD2a", "proofs": [ "3dbWojDNzVAv6gfHGk2cnJLtdwdTsTkdrEyzszSqNzKZE4x7kvnamoNTPda8C6GK8LfHkn4BztRdJU4NRLHvrMVa" ], "script": "base64:BgKiAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEgcKBQgICAEEEgUKAwgEARIMCgoICAgBAQEBAQEEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCIQBAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gABENQTU0CBGNwbW0ABEZMQVQCBGZsYXQAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAKa1Bvb2xUb3RhbAIKX3Bvb2xUb3RhbAAOa1Bvb2xUb3RhbExvYW4CDl9wb29sVG90YWxMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4ADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAKa1NoYXJlUG9vbAIMX3Bvb2xTaGFyZUlkAA5rUG9vbENhcENoYW5nZQIOX3Bvb2xDYXBDaGFuZ2UAD2tUb2tlbkxhc3RQcmljZQIKbGFzdF9wcmljZQAOa1ByaWNlSW5PcmFjbGUCB190d2FwNUIAB2tBY3RpdmUCBmFjdGl2ZQAMa0FjdGl2ZVVzZXJzAgthY3RpdmVVc2VycwALa0FjdGl2ZVNGV1gCB19hY3RpdmUAC2tQb29sQWN0aXZlAgtfYWN0aXZlUG9vbAANa1VzZXJTdG9wTG9zcwIJX3N0b3BMb3NzABdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIXX2ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkACWtNb25leUJveAIOYXhseV9tb25leV9ib3gADmtTRkZhcm1pbmdBZGRyAhNzd29wZmlfZmFybWluZ19hZGRyAAxrTGVuZFNlcnZpY2UCEWxlbmRfc2VydmljZV9hZGRyAA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAC2tFeENvbnRyYWN0AhFleGNoYW5nZV9jb250cmFjdAAPa1d4U3dhcENvbnRyYWN0AhB3eF9zd2FwX2NvbnRyYWN0AAdrU3dvcElkAgdzd29wX2lkAAVrV3hJZAIFd3hfaWQAD2tHcm91cDFBZG1pbjFQSwIVZ3JvdXAxX2FkbWluMV9wdWJfa2V5AA9rR3JvdXAxQWRtaW4yUEsCFWdyb3VwMV9hZG1pbjJfcHViX2tleQAPa0dyb3VwMkFkbWluMVBLAhVncm91cDJfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDJBZG1pbjJQSwIVZ3JvdXAyX2FkbWluMl9wdWJfa2V5AAhtb25leUJveAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQlrTW9uZXlCb3gCGE5vIGF4bHkgbW9uZXlCb3ggYWRkcmVzcwAKZXhDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDGtQcmljZU9yYWNsZQIXTm8gcHJpY2Ugb3JhY2xlIGFkZHJlc3MADnd4U3dhcENvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tXeFN3YXBDb250cmFjdAISTm8gd3ggc3dhcCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFBWtXeElkAghObyB3eCBpZAAOZ3JvdXAxQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDFBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjFQSwAOZ3JvdXAxQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDFBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjJQSwAOZ3JvdXAyQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAOZ3JvdXAyQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAKb3BlcmF0b3JQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa09wZXJhdG9yQ2FsbFBLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwEPdW5rbm93blBvb2xUeXBlAAkAAgECD1dyb25nIHBvb2wgdHlwZQEOZ2V0TGVuZFNydkFkZHIACQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDGtMZW5kU2VydmljZQIbQ2FuJ3QgZ2V0IGxlbmQgc2VydmljZSBhZGRyAQ5pc09wZXJhdG9yQ2FsbAEBaQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFCm9wZXJhdG9yUEsFBHVuaXQJAAIBAiRPbmx5IG9wZXJhdG9yIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BC2lzQWRtaW5DYWxsAQFpAwMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMVBLBgkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4yUEsFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzTGFuZENhbGwBAWkDCQAAAggFAWkGY2FsbGVyCQEOZ2V0TGVuZFNydkFkZHIABQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCGlzQWN0aXZlAAMJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGBgUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBEGlzQWN0aXZlRm9yVXNlcnMAAwMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYGBwUEdW5pdAkAAgECKURBcHAgaXMgaW5hY3RpdmUgZm9yIHVzZXJzIGF0IHRoaXMgbW9tZW50AQxpc1Bvb2xBY3RpdmUCBHBvb2wEdHlwZQQKV1hTRkFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHR5cGUFC2tBY3RpdmVTRldYBgQKcG9vbEFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgMDBQpXWFNGQWN0aXZlBQpwb29sQWN0aXZlBwYHAQ5hY2NvdW50QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA8AcCBQR0aGlzBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAAIBAgtNYXRjaCBlcnJvcgERZ2V0U0ZQb29sQmFsYW5jZXMBCHBvb2xBZGRyCQCUCgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEFBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEEgYXNzZXQgYmFsYW5jZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQkFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBiYWxhbmNlARFnZXRXWFBvb2xCYWxhbmNlcwMIcG9vbEFkZHIDYUlkA2JJZAkAlAoCCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNhSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYklkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBD2dldFBvb2xCYWxhbmNlcwQIcG9vbEFkZHIEdHlwZQNhSWQDYklkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAkBD3Vua25vd25Qb29sVHlwZQABDWdldFNGUG9vbERhdGEBCHBvb2xBZGRyBAskdDA4MDIzODA3MgkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgULJHQwODAyMzgwNzIFCyR0MDgwMjM4MDcyBARiYWxCCAULJHQwODAyMzgwNzICXzIEBGJhbEEIBQskdDA4MDIzODA3MgJfMQkAlwoFCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xBQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQkFzc2V0SWQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQFBGJhbEEFBGJhbEIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUOa1NGUG9vbFNoYXJlSWQCGENhbid0IGdldCBzaGFyZSBhc3NldCBpZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgENZ2V0V1hQb29sRGF0YQEIcG9vbEFkZHIEA2NmZwoAAUAJAPwHBAUIcG9vbEFkZHICHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNjZmcFA2NmZwQDYUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAEAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAQDYklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAFAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAQHc2hhcmVJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcAAwMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGkNhbid0IGdldCBwb29sIExQIGFzc2V0IGlkBAskdDA4NzY5ODgyOAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkAwkAAAIFCyR0MDg3Njk4ODI4BQskdDA4NzY5ODgyOAQEYmFsQggFCyR0MDg3Njk4ODI4Al8yBARiYWxBCAULJHQwODc2OTg4MjgCXzEJAJcKBQUDYUlkBQNiSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC2dldFBvb2xEYXRhAghwb29sQWRkcgR0eXBlAwkAAAIFBHR5cGUFB1NGX1BPT0wJAQ1nZXRTRlBvb2xEYXRhAQUIcG9vbEFkZHIDCQAAAgUEdHlwZQUHV1hfUE9PTAkBDWdldFdYUG9vbERhdGEBBQhwb29sQWRkcgkBD3Vua25vd25Qb29sVHlwZQABDmdldFNoYXJlU3VwcGx5Awhwb29sQWRkcgR0eXBlB3NoYXJlSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRJrU0ZQb29sU2hhcmVTdXBwbHkCHENhbid0IGdldCBzaGFyZSBhc3NldCBzdXBwbHkDCQAAAgUEdHlwZQUHV1hfUE9PTAgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFB3NoYXJlSWQCDVdyb25nIFNoYXJlSWQIcXVhbnRpdHkJAQ91bmtub3duUG9vbFR5cGUAARFnZXRQb29sVG90YWxTaGFyZQEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFCmtQb29sVG90YWwAAAEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuAAABGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEEdXNlcgkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBRBrVXNlclBvc2l0aW9uTnVtAAAAAQEKZ2V0QXhseUZlZQIEcG9vbAdmZWVUeXBlAwkAAAIFB2ZlZVR5cGUFDENBUF9GRUVfTE9BTgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRNrQXhseVdpdGhMb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFD0NBUF9GRUVfTk9fTE9BTgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrQXhseU5vTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQhMT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRJrQXhseUluRmVlV2l0aExvYW4DCQAAAgUHZmVlVHlwZQULTk9fTE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAwkAAAIFB2ZlZVR5cGUFBk5PX0ZFRQAACQACAQIOV3JvbmcgZmVlIHR5cGUBEGdldFNGRmFybWluZ0FkZHIACQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDmtTRkZhcm1pbmdBZGRyAh1DYW4ndCBnZXQgc3dvcGZpIGZhcm1pbmcgYWRkcgEQZ2V0V1hGYXJtaW5nQWRkcgEIcG9vbEFkZHIECWZDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgITJXNfX2ZhY3RvcnlDb250cmFjdAIiQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY29udHJhY3QgYWRkcgQKZmFjdHJveUNmZwkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUJZkNvbnRyYWN0AhElc19fZmFjdG9yeUNvbmZpZwIYQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY2ZnAgJfXwkBB0FkZHJlc3MBCQDZBAEJAJEDAgUKZmFjdHJveUNmZwABAQxhc3NldElkVG9TdHIBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQIMTm90IEFzc2V0IGlkAQ5hc3NldElkRnJvbVN0cgEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARBnZXRBc3NldERlY2ltYWxzAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTAAgEByRtYXRjaDAJAOwHAQkA2QQBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CGRlY2ltYWxzCQACAQIQQ2FuJ3QgZmluZCBhc3NldAERZ2V0QXNzZXRQcmVjaXRpb24BB2Fzc2V0SWQJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQdhc3NldElkAAAAAAUERE9XTgEOZ2V0QXNzZXRzUHJpY2UBCGFzc2V0SWRzCgEJZ2V0UHJpY2VzAgFhB2Fzc2V0SWQECmFzc2V0UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlAP///////////wEJAM0IAgUBYQUKYXNzZXRQcmljZQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZ2V0UHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIBDWdldFNoYXJlUHJpY2UBB3NoYXJlSWQEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wCIENhbid0IGZpbmQgcG9vbCBhZGRyIGJ5IHNoYXJlIGlkBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAxMTgxNzExODgyCQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA2FJZAgFDSR0MDExODE3MTE4ODICXzEEA2JJZAgFDSR0MDExODE3MTE4ODICXzIECGFCYWxhbmNlCAUNJHQwMTE4MTcxMTg4MgJfMwQIYkJhbGFuY2UIBQ0kdDAxMTgxNzExODgyAl80BAZwcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBAdkUHJpY2VBCQCRAwIFBnByaWNlcwAABAdkUHJpY2VCCQCRAwIFBnByaWNlcwABAwMJAGYCAAAFB2RQcmljZUEGCQBmAgAABQdkUHJpY2VCAP///////////wEEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQECkFQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBApCUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQOc2hhcmVQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQdzaGFyZUlkAAAAAAUERE9XTgQDc3VtCQBkAgkAawMFCGFCYWxhbmNlBQdkUHJpY2VBBQpBUHJlY2lzaW9uCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24JAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQEOZ2V0U2hhcmVQcmljZXMBCHNoYXJlSWRzCgEJZ2V0UHJpY2VzAgFhB3NoYXJlSWQJAM0IAgUBYQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCgACJGwFCHNoYXJlSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEOZ2V0Q3Vyc0VudHJpZXMEA2FJZANiSWQHc2hhcmVJZAh3QW1vdW50cwQMYXNzZXRzUHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQKc2hhcmVQcmljZQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkBAZwcmljZXMJAM4IAgkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsBQh3QW1vdW50cwkAzAgCCQELU3RyaW5nRW50cnkCBQ9rVG9rZW5MYXN0UHJpY2UJALkJAgUGcHJpY2VzAgEsBQNuaWwBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwgFcFR5cGUIcG9vbEFkZHIEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCAwkAAAIFBXBUeXBlBQdTRl9QT09MBARyZXBsCgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICIGNhbGNMUFJlcGxlbmlzaFR3b1Rva2Vuc1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQRwbXRBCQDMCAIJAKQDAQUEcG10QgUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUEcmVwbAUEcmVwbAkAlwoFCgABQAkAkQMCBQRyZXBsAAMDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQRyZXBsAAQDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQRyZXBsAAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQEMYXNzZXRJZFRvU3RyAQkAkQMCBQRyZXBsAAIKAAFACQCRAwIFBHJlcGwAAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDEzNDI2MTM2NzYJAJQKAgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgIgZXZhbHVhdGVQdXRCeUFtb3VudEFzc2V0UkVBRE9OTFkJAMwIAgUEcG10QQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgIfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQkAzAgCBQRwbXRCBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFDSR0MDEzNDI2MTM2NzYFDSR0MDEzNDI2MTM2NzYECmV2YWxQdXRJbkIIBQ0kdDAxMzQyNjEzNjc2Al8yBApldmFsUHV0SW5BCAUNJHQwMTM0MjYxMzY3NgJfMQQFbHBJbkEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAEEBWxwSW5CCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgABAwkAZgIFBWxwSW5CBQVscEluQQQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQAICQCXCgUFBHBtdEEFA3BtdAkAZQIFBHBtdEIFA3BtdAUDYklkBQVscEluQgQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgAHCQCXCgUFA3BtdAUEcG10QgkAZQIFBHBtdEEFA3BtdAUDYUlkBQVscEluQQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYIcG9vbEFkZHIFcFR5cGUEcG10QQNhSWQEcG10QgNiSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNhSWQFBHBtdEEJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2JJZAUEcG10QgUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwkAzAgCCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcEBQhwb29sQWRkcgIDcHV0CQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUECHBvb2xBZGRyBXBUeXBlA3BtdAVwbXRJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFBXBtdElkBQNwbXQFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgkAzAgCCQDMCAICATAJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFCHBvb2xBZGRyAglwdXRPbmVUa24JAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTUzMzUxNTY4NQMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE1MzM1MTU2ODUCXzEEBWZOYW1lCAUNJHQwMTUzMzUxNTY4NQJfMgQGcGFyYW1zCAUNJHQwMTUzMzUxNTY4NQJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNjEwNzE2NDEzAwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE2MTA3MTY0MTMCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNjEwNzE2NDEzAl8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxNzE1MzE3MTkyCQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxNzE1MzE3MTkyAl8xBAVwckZlZQgFDSR0MDE3MTUzMTcxOTICXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTcyMzIxNzU0MAMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTcyMzIxNzU0MAJfMQQKYXNzZXRUb1BheQgFDSR0MDE3MjMyMTc1NDACXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAZwb29sRkIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBRdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIAAwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABA0kdDAxNzk4MTE4MTkzAwkAAAIFBnBvb2xGQgIACQCVCgMFBGJhbEEFBGJhbEIFBHBvb2wEDSR0MDE4MDg3MTgxNjAJARFnZXRTRlBvb2xCYWxhbmNlcwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBnBvb2xGQgQGc2ZCYWxBCAUNJHQwMTgwODcxODE2MAJfMQQGc2ZCYWxCCAUNJHQwMTgwODcxODE2MAJfMgkAlQoDBQZzZkJhbEEFBnNmQmFsQgUGcG9vbEZCBAVwQmFsQQgFDSR0MDE3OTgxMTgxOTMCXzEEBXBCYWxCCAUNJHQwMTc5ODExODE5MwJfMgQGZXhQb29sCAUNJHQwMTc5ODExODE5MwJfMwQNJHQwMTgxOTgxODMyNAkBEWNhbGNBbW91bnRUb1BheVNGBwUGZXhQb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBXBCYWxBBQVwQmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTgxOTgxODMyNAJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxODE5ODE4MzI0Al8yCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmV4UG9vbAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW91bnRUb2tlblRvR2V0BQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTg1MjYxODY0OAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAxODUyNjE4NjQ4Al8xBAthbW91bnRUb1BheQgFDSR0MDE4NTI2MTg2NDgCXzIJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgUQYW1vdW50VG9rZW5Ub0dldAkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDE4OTM1MTkzOTkDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICE2V2YWx1YXRlR2V0UkVBRE9OTFkJAMwIAgUHc2hhcmVJZAkAzAgCBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18DCQAAAgUDaW52BQNpbnYJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2ludgABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUABAdhbW91bnRBCAUNJHQwMTg5MzUxOTM5OQJfMQQHYW1vdW50QggFDSR0MDE4OTM1MTkzOTkCXzIJAJQKAgUHYW1vdW50QQUHYW1vdW50QgELY2xhaW1GYXJtZWQCBXBUeXBlBHBvb2wDCQAAAgUFcFR5cGUFB1NGX1BPT0wECWJhbEJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAgVjbGFpbQkAzAgCBQRwb29sBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFBlNXT1BJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUGU1dPUElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxOTc2NzE5ODQ2CQENZ2V0V1hQb29sRGF0YQEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEA2FJZAgFDSR0MDE5NzY3MTk4NDYCXzEEA2JJZAgFDSR0MDE5NzY3MTk4NDYCXzIEBGFCYWwIBQ0kdDAxOTc2NzE5ODQ2Al8zBARiQmFsCAUNJHQwMTk3NjcxOTg0NgJfNAQEbHBJZAgFDSR0MDE5NzY3MTk4NDYCXzUECWJhbEJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQDaW52CQD8BwQJARBnZXRXWEZhcm1pbmdBZGRyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAIHY2xhaW1XeAkAzAgCBQRscElkBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFBFdYSUQJAJQKAgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUFBFdYSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAQ9yZXBsZW5pc2hCeVR5cGUKBXBUeXBlBHBvb2wHZmVlVHlwZQRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIETFBJZAQPbHBCYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQDCQAAAgUPbHBCYWxhbmNlQmVmb3JlBQ9scEJhbGFuY2VCZWZvcmUECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBA0kdDAyMDQ0NDIwODYwAwMJAGYCBQRwbXRBAAAJAGYCBQRwbXRCAAAHBA0kdDAyMDUxMDIwNjI2CQEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCAUFcFR5cGUFCHBvb2xBZGRyBQRwbXRBBQNhSWQFBHBtdEIFA2JJZAUEYmFsQQUEYmFsQgQGcG10SW5BCAUNJHQwMjA1MTAyMDYyNgJfMQQGcG10SW5CCAUNJHQwMjA1MTAyMDYyNgJfMgQGY2hhbmdlCAUNJHQwMjA1MTAyMDYyNgJfMwQIY2hhbmdlSWQIBQ0kdDAyMDUxMDIwNjI2Al80BANpbnYJARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGBQhwb29sQWRkcgUFcFR5cGUFBnBtdEluQQUDYUlkBQZwbXRJbkIFA2JJZAMJAAACBQNpbnYFA2ludgkAlAoCBQZjaGFuZ2UFCGNoYW5nZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAZgIFBHBtdEEAAAkAlAoCBQRwbXRBBQNhSWQDCQBmAgUEcG10QgAACQCUCgIFBHBtdEIFA2JJZAkAAgECEHBtdHMgbXVzdCBiZSA+IDAEBmNoYW5nZQgFDSR0MDIwNDQ0MjA4NjACXzEECGNoYW5nZUlkCAUNJHQwMjA0NDQyMDg2MAJfMgQDaW52AwkAZgIFBmNoYW5nZQAACQEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUEBQhwb29sQWRkcgUFcFR5cGUFBmNoYW5nZQUIY2hhbmdlSWQFA25pbAMJAAACBQNpbnYFA2ludgQObHBCYWxhbmNlQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAQLdG90YWxTdGFrZWQJAGUCBQ5scEJhbGFuY2VBZnRlcgUPbHBCYWxhbmNlQmVmb3JlBA1heGx5RmVlQW1vdW50CQBrAwULdG90YWxTdGFrZWQJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgQRdXNlclNoYXJlRm9yU3Rha2UJAGUCBQt0b3RhbFN0YWtlZAUNYXhseUZlZUFtb3VudAMJAGcCAAAFEXVzZXJTaGFyZUZvclN0YWtlCQACAQIoYW1vdW50IG9mIHN0YWtlZCBzaGFyZXRva2VucyBtdXN0IGJlID4gMAQFaW52TFAJAQdzdGFrZUxQBAUEcG9vbAUFcFR5cGUFBExQSWQFEXVzZXJTaGFyZUZvclN0YWtlAwkAAAIFBWludkxQBQVpbnZMUAkAlAoCBRF1c2VyU2hhcmVGb3JTdGFrZQUNYXhseUZlZUFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQcmVwbGVuaXNoRW50cmllcwgEcG9vbAR1c2VyDHN0YWtlZEFtb3VudA1heGx5RmVlQW1vdW50BnBvc051bQdzaGFyZUlkBHR5cGUId2l0aExvYW4EC3RvdGFsQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA90b3RhbEFtb3VudExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQNJHQwMjE3MTcyMTk1NQMFCHdpdGhMb2FuCQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JAGQCBQ90b3RhbEFtb3VudExvYW4FDHN0YWtlZEFtb3VudAkAlAoCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FD3RvdGFsQW1vdW50TG9hbgQPY3VyUG9vbEludGVyZXN0CAUNJHQwMjE3MTcyMTk1NQJfMQQTdG90YWxTdGFrZWRXaXRoTG9hbggFDSR0MDIxNzE3MjE5NTUCXzIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFC3RvdGFsQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4FE3RvdGFsU3Rha2VkV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUNa1VzZXJQb3NpdGlvbgUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFWtVc2VyUG9zaXRpb25JbnRlcmVzdAUPY3VyUG9vbEludGVyZXN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAUEcG9vbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRBrVXNlclBvc2l0aW9uTnVtBQZwb3NOdW0JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlGZWVBbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAQlsaXN0VG9JbnQCAWEEaXRlbQkAzQgCBQFhCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0BEGRpcmVjdFN3b3BmaUNQTU0CBXJBcmdzB3Rva2VuVG8EBGRBcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUFckFyZ3MAAQQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDcG10CQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBCQCRAwIFBHBtdFAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBHBtdFAAAQUDbmlsBAttaW5Ub1JlY2l2ZQkAkQMCBQVyQXJncwADBANpbnYJAPwHBAUEZEFwcAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgULbWluVG9SZWNpdmUFA25pbAUDbmlsBQNwbXQDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2RpcmVjdFJvdXRpbmdTd29wZmkCBXJBcmdzB3Rva2VuVG8EBGRBcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUFckFyZ3MAAQQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQEBHBtdFAJALUJAgkAkQMCBQVyQXJncwACAgF8CQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEBGFyZ3MEBWVBcmdzCQC1CQIJAJEDAgUFckFyZ3MAAwIBfAQKZXhjaGFuZ2VycwkAtQkCCQCRAwIFBWVBcmdzAAACASwEDmV4Y2hhbmdlcnNUeXBlCQC1CQIJAJEDAgUFZUFyZ3MAAQIBLAQFYXJnczEKAAIkbAkAtQkCCQCRAwIFBWVBcmdzAAICASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWxpc3RUb0ludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwQFYXJnczIKAAIkbAkAtQkCCQCRAwIFBWVBcmdzAAMCASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWxpc3RUb0ludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwQRcm91dGluZ0Fzc2V0c0tleXMJALUJAgkAkQMCBQVlQXJncwAEAgEsBAttaW5Ub1JlY2l2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWVBcmdzAAUJAMwIAgUKZXhjaGFuZ2VycwkAzAgCBQ5leGNoYW5nZXJzVHlwZQkAzAgCBQVhcmdzMQkAzAgCBQVhcmdzMgkAzAgCBRFyb3V0aW5nQXNzZXRzS2V5cwkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBANpbnYJAPwHBAUEZEFwcAIMcm91dGluZ1RyYWRlBQRhcmdzBQNwbXQDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCmNhcGl0YWxpemUEBHBvb2wFcFR5cGUHdG9rZW5JZAt0b2tlbkFtb3VudAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDAyNDA2MjI0MTI4CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDI0MDYyMjQxMjgCXzEEA0JJZAgFDSR0MDI0MDYyMjQxMjgCXzIEBGJhbEEIBQ0kdDAyNDA2MjI0MTI4Al8zBARiYWxCCAUNJHQwMjQwNjIyNDEyOAJfNAQHc2hhcmVJZAgFDSR0MDI0MDYyMjQxMjgCXzUDAwkBAiE9AgUHdG9rZW5JZAUDQUlkCQECIT0CBQd0b2tlbklkBQNCSWQHCQACAQILV3JvbmcgYXNzZXQEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wDCQAAAgUQdG90YWxTaGFyZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQt0b2tlbkFtb3VudAkA2QQBBQd0b2tlbklkBQNuaWwEGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBAtsb2FuUGVyY2VudAkAawMFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUGU0NBTEU4BRB0b3RhbFNoYXJlQW1vdW50BBB0b2tlbnNGb3JGZWVMb2FuCQBrAwULdG9rZW5BbW91bnQFC2xvYW5QZXJjZW50BQZTQ0FMRTgEEnRva2Vuc0ZvckZlZU5vTG9hbgkAZQIFC3Rva2VuQW1vdW50BRB0b2tlbnNGb3JGZWVMb2FuBAtheGx5RmVlTG9hbgkAawMFEHRva2Vuc0ZvckZlZUxvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUMQ0FQX0ZFRV9MT0FOBQpGRUVfU0NBTEU2BA1heGx5RmVlTm9Mb2FuCQBrAwUSdG9rZW5zRm9yRmVlTm9Mb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFD0NBUF9GRUVfTk9fTE9BTgUKRkVFX1NDQUxFNgQHYXhseUZlZQkAZAIFC2F4bHlGZWVMb2FuBQ1heGx5RmVlTm9Mb2FuBA0kdDAyNDg3MzI0OTczAwkAAAIFB3Rva2VuSWQFA0FJZAkAlAoCCQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUAAAkAlAoCAAAJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQQEcG10QQgFDSR0MDI0ODczMjQ5NzMCXzEEBHBtdEIIBQ0kdDAyNDg3MzI0OTczAl8yBA0kdDAyNDk3NjI1MDgwCQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFBk5PX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQEDHN0YWtlZEFtb3VudAgFDSR0MDI0OTc2MjUwODACXzEEAm5mCAUNJHQwMjQ5NzYyNTA4MAJfMgQTY3VyUG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQKc3Rha2VkTG9hbgkAawMFDHN0YWtlZEFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQMc3Rha2VkTm9Mb2FuCQBlAgUMc3Rha2VkQW1vdW50BQpzdGFrZWRMb2FuBA9uZXdJbnRlcmVzdExvYW4DCQBmAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRNjdXJQb29sSW50ZXJlc3RMb2FuCQBrAwUKc3Rha2VkTG9hbgUHU0NBTEUxMAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAEEW5ld0ludGVyZXN0Tm9Mb2FuAwkAZgIJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkAawMFDHN0YWtlZE5vTG9hbgUHU0NBTEUxMAkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4FD25ld0ludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuBRFuZXdJbnRlcmVzdE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgUQdG90YWxTaGFyZUFtb3VudAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQpzdGFrZWRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQdheGx5RmVlCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlbklkBQNuaWwJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkBQNuaWwBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQEdXNlcgRwb29sBXBvc0lkCGJvcnJvd2VkBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAx1c2VySW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0BAxwb29sSW50ZXJlc3QDBQhib3Jyb3dlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuCQBkAgUHcEFtb3VudAkAawMFB3BBbW91bnQJAGUCBQxwb29sSW50ZXJlc3QFDHVzZXJJbnRlcmVzdAUHU0NBTEUxMAEPY2FsY1N0b3BMb3NzRmVlBARwb29sCmlzQm9ycm93ZWQIc3RvcExvc3MKbHBXaXRoZHJhdwQHZmVlVHlwZQMFCmlzQm9ycm93ZWQFDVNUT1BMT1NTX0xPQU4FFFNUT1BMT1NTX0ZFRV9OT19MT0FOAwUIc3RvcExvc3MJAGsDBQpscFdpdGhkcmF3CQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYAAAEOd2l0aGRyYXdUb1VzZXIEBHVzZXIEcG9vbAVwb3NJZAhzdG9wTG9zcwQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQKaXNCb3Jyb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAAAAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBXBvc0lkBQppc0JvcnJvd2VkBA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwMjc2MDkyNzY4MQkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDAyNzYwOTI3NjgxAl8xBAZpZEJTdHIIBQ0kdDAyNzYwOTI3NjgxAl8yBARiYWxBCAUNJHQwMjc2MDkyNzY4MQJfMwQEYmFsQggFDSR0MDI3NjA5Mjc2ODECXzQEB3NoYXJlSWQIBQ0kdDAyNzYwOTI3NjgxAl81BA0kdDAyNzY4NDI3NzUxCQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDAyNzY4NDI3NzUxAl8xBANpZEIIBQ0kdDAyNzY4NDI3NzUxAl8yBAtzdG9wTG9zc0ZlZQkBD2NhbGNTdG9wTG9zc0ZlZQQFBHBvb2wFCmlzQm9ycm93ZWQFCHN0b3BMb3NzBQ91c2VyQ2FuV2l0aGRyYXcEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MBANpbnYJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAULc3RvcExvc3NGZWUDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAgh3aXRoZHJhdwkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAZAIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICA2dldAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQADCQAAAgUDaW52BQNpbnYECmNCYWxBQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQpjQmFsQUFmdGVyBQpjQmFsQUFmdGVyBApjQmFsQkFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUKY0JhbEJBZnRlcgUKY0JhbEJBZnRlcgQNJHQwMjg0NDYyODUzNQkAlAoCCQBlAgUKY0JhbEFBZnRlcgULY0JhbEFCZWZvcmUJAGUCBQpjQmFsQkFmdGVyBQtjQmFsQkJlZm9yZQQNdG9rZW5zQW1vdW50QQgFDSR0MDI4NDQ2Mjg1MzUCXzEEDXRva2Vuc0Ftb3VudEIIBQ0kdDAyODQ0NjI4NTM1Al8yBA0kdDAyODUzODI5Nzc0AwUKaXNCb3Jyb3dlZAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkCQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEC2Nsb3NlRGJ0SW52AwkAZgIFBGRlYnQAAAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAghyZXBheUZvcgkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQULYm9ycm93QXNzZXQFBGRlYnQFA25pbAAAAwkAAAIFC2Nsb3NlRGJ0SW52BQtjbG9zZURidEludgMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQCUCgIJAGUCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQUEZGVidAkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUJAJQKAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUJAGUCCQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQUEZGVidAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQ10b2tlbnNBbW91bnRBBQ10b2tlbnNBbW91bnRCBAd0b1VzZXJBCAUNJHQwMjg1MzgyOTc3NAJfMQQHdG9Vc2VyQggFDSR0MDI4NTM4Mjk3NzQCXzIEFHBvb2xUb3RhbExvYW5FbnRyaWVzAwUKaXNCb3Jyb3dlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZQIJAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFA25pbAUDbmlsBAdlbnRyaWVzCQDOCAIJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyUG9zaXRpb25Qb29sCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgUHdG9Vc2VyQQUDaWRBCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJCBQNpZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3N0b3BMb3NzRmVlCQDZBAEFB3NoYXJlSWQFA25pbAUUcG9vbFRvdGFsTG9hbkVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwJAJQKAgUHZW50cmllcwkAzAgCBQd0b1VzZXJBCQDMCAIFB3RvVXNlckIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKCQCdCgsFBHVzZXIFBHBvb2wFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQdid0Fzc2V0BQhid0Ftb3VudAEQY2FsY0JvcnJvd0Ftb3VudAYEcG10QQRwbXRCA2FJZANiSWQIbGV2ZXJhZ2UIYm9ycm93SWQDAwkBAiE9AgUIYm9ycm93SWQFA2FJZAkBAiE9AgUIYm9ycm93SWQFA2JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEB2RQcmljZUEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNhSWQFDmtQcmljZUluT3JhY2xlBAdkUHJpY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYklkBQ5rUHJpY2VJbk9yYWNsZQQGZGVjUHJBCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQGZGVjUHJCCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQMcGF5ZEluRG9sbGFyCQBkAgkAawMFB2RQcmljZUEFBHBtdEEFBmRlY1ByQQkAawMFB2RQcmljZUIFBHBtdEIFBmRlY1ByQgQNJHQwMzE3NTYzMTg1MwMJAAACBQhib3Jyb3dJZAUDYUlkCQCUCgIFB2RQcmljZUEFBmRlY1ByQQkAlAoCBQdkUHJpY2VCBQZkZWNQckIEC2JvcnJvd1ByaWNlCAUNJHQwMzE3NTYzMTg1MwJfMQQLYm9ycm93RGVjUHIIBQ0kdDAzMTc1NjMxODUzAl8yCQBrAwkAawMFDHBheWRJbkRvbGxhcgkAZQIFCGxldmVyYWdlAGQAZAULYm9ycm93RGVjUHIFC2JvcnJvd1ByaWNlARJwYXJzZVJlcGxlbmlzaFBtdHMDBHBtdHMDQUlkA0JJZAMJAAACCQCQAwEFBHBtdHMAAgMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBBAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAQdhc3NldElkBQNCSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEIJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAgJAJEDAgUEcG10cwABBmFtb3VudAMJAAACCQCQAwEFBHBtdHMAAQMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50AAADCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNCSWQJAJQKAgAACAkAkQMCBQRwbXRzAAAGYW1vdW50CQACAQINV3JvbmcgcGF5bWVudAkAAgECHE9uZSBvciB0d28gcGF5bWVudHMgZXhwZWN0ZWQBD2NhbGNQcmljZUltcGFjdAQEYmFsQQRiYWxCB25ld0JhbEEHbmV3QmFsQgQDcHJpCQBoAgkAZQIFBlNDQUxFOAkAawMJAGsDBQRiYWxCBQZTQ0FMRTgFBGJhbEEFBlNDQUxFOAkAawMFB25ld0JhbEIFBlNDQUxFOAUHbmV3QmFsQQBkAwkAZgIAAAUDcHJpCQBoAgUDcHJpAP///////////wEFA3ByaQERY2xhaW1BbmRDaGVja0FtbnQFBHBvb2wFcFR5cGUFY2xhaW0GYW1vdW50BmNoYW5nZQQNJHQwMzI4NTMzMzExNQMFBWNsYWltCQELY2xhaW1GYXJtZWQCBQVwVHlwZQUEcG9vbAQMY2xhaW1lZEFzc2V0AwkAAAIFBXBUeXBlBQdTRl9QT09MBQZTV09QSUQDCQAAAgUFcFR5cGUFB1dYX1BPT0wFBFdYSUQJAQ91bmtub3duUG9vbFR5cGUACQCUCgIFBmFtb3VudAUMY2xhaW1lZEFzc2V0AwkAAAIFDSR0MDMyODUzMzMxMTUFDSR0MDMyODUzMzMxMTUECmNsYWltQXNzZXQIBQ0kdDAzMjg1MzMzMTE1Al8yBAtjbGFpbUFtb3VudAgFDSR0MDMyODUzMzMxMTUCXzEEA2JhbAkBDmFjY291bnRCYWxhbmNlAQUKY2xhaW1Bc3NldAMJAAACBQNiYWwFA2JhbAMJAGYCBQZhbW91bnQFA2JhbAkAAgECGVRvIGJpZyBhbW91bnQgdG8gZXhjaGFuZ2UJAJQKAgULY2xhaW1BbW91bnQFCmNsYWltQXNzZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4bAWkBE2dldFBvb2xJbmZvUkVBRE9OTFkBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMzM0ODIzMzU3MgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzMzQ4MjMzNTcyAl8xBANCSWQIBQ0kdDAzMzQ4MjMzNTcyAl8yBARiYWxBCAUNJHQwMzM0ODIzMzU3MgJfMwQEYmFsQggFDSR0MDMzNDgyMzM1NzICXzQEB3NoYXJlSWQIBQ0kdDAzMzQ4MjMzNTcyAl81BAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAkAmAoGBQNBSWQFA0JJZAUHc2hhcmVJZAUEYmFsQQUEYmFsQgULc2hhcmVTdXBwbHkBaQEaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkBB3NoYXJlSWQEC3NoYXJlUHJpY2VzCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQJAJQKAgUDbmlsBQtzaGFyZVByaWNlcwFpASJnZXRVc2VyUG9zaXRpb25TaGFyZUFtb3VudFJFQURPTkxZAgR1c2VyBnBvc051bQQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wCEFVua25vd24gcG9zaXRpb24EDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBnBvc051bQkAZgIFDGJvcnJvd0Ftb3VudAAACQCUCgIFA25pbAUPdXNlckNhbldpdGhkcmF3AWkBF2dldFVzZXJQb3NpdGlvblJFQURPTkxZAwR1c2VyBXBvb2xzBnBvc051bQoBB3VzZXJQb3MCAWEEcG9vbAQNJHQwMzQ0NDUzNDUxNQUBYQQJd0Ftb3VudHNBCAUNJHQwMzQ0NDUzNDUxNQJfMQQJd0Ftb3VudHNCCAUNJHQwMzQ0NDUzNDUxNQJfMgQFZGVidHMIBQ0kdDAzNDQ0NTM0NTE1Al8zBAtlcVdBbW91bnRzQQgFDSR0MDM0NDQ1MzQ1MTUCXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzQ0NDUzNDUxNQJfNQQFaW5kZXgIBQ0kdDAzNDQ0NTM0NTE1Al82AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BQ1rVXNlclBvc2l0aW9uCQCYCgYJAM0IAgUJd0Ftb3VudHNBAAAJAM0IAgUJd0Ftb3VudHNCAAAJAM0IAgUFZGVidHMAAAkAzQgCBQtlcVdBbW91bnRzQQAACQDNCAIFC2VxV0Ftb3VudHNCAAAJAGQCBQVpbmRleAABBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMzQ3OTQzNDg4NAkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzNDc5NDM0ODg0Al8xBANCSWQIBQ0kdDAzNDc5NDM0ODg0Al8yBARiYWxBCAUNJHQwMzQ3OTQzNDg4NAJfMwQEYmFsQggFDSR0MDM0Nzk0MzQ4ODQCXzQEB3NoYXJlSWQIBQ0kdDAzNDc5NDM0ODg0Al81BAxib3Jyb3dBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAURa1VzZXJCb3Jyb3dBbW91bnQAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAkAkQMCBQZwb3NOdW0FBWluZGV4CQBmAgUMYm9ycm93QW1vdW50AAAEDSR0MDM1MTAwMzUyMjAJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BAh3QW1vdW50QQgFDSR0MDM1MTAwMzUyMjACXzEECHdBbW91bnRCCAUNJHQwMzUxMDAzNTIyMAJfMgMJAGYCBQxib3Jyb3dBbW91bnQAAAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEmtVc2VyQm9ycm93QXNzZXRJZAQEZGVidAoAAUAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIMZ2V0QXNzZXREZWJ0CQDMCAIHCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQBmAgUEZGVidAUId0Ftb3VudEEHCQBlAgUEZGVidAUId0Ftb3VudEEDAwkAAAIFC2JvcnJvd0Fzc2V0BQNCSWQJAGYCBQRkZWJ0BQh3QW1vdW50QgcJAGUCBQRkZWJ0BQh3QW1vdW50QgAABAthbW91bnRUb1BheQMJAGYCBQ1hbW91bnRUb0dldEV4AAADCQAAAgUFcFR5cGUFB1NGX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yCQEPdW5rbm93blBvb2xUeXBlAAAABA0kdDAzNjEzMjM2MzUxAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAJQKAgkAZQIJAGQCBQh3QW1vdW50QQUNYW1vdW50VG9HZXRFeAUEZGVidAkAZQIFCHdBbW91bnRCBQthbW91bnRUb1BheQkAlAoCCQBlAgUId0Ftb3VudEEFC2Ftb3VudFRvUGF5CQBlAgkAZAIFCHdBbW91bnRCBQ1hbW91bnRUb0dldEV4BQRkZWJ0BAplcVdBbW91bnRBCAUNJHQwMzYxMzIzNjM1MQJfMQQKZXFXQW1vdW50QggFDSR0MDM2MTMyMzYzNTECXzIJAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAM0IAgUFZGVidHMFBGRlYnQJAM0IAgULZXFXQW1vdW50c0EFCmVxV0Ftb3VudEEJAM0IAgULZXFXQW1vdW50c0IFCmVxV0Ftb3VudEIJAGQCBQVpbmRleAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCBQVkZWJ0cwkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAGQCBQVpbmRleAABBA0kdDAzNjYwNjM2NzE3CgACJGwFBXBvb2xzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAmAoGBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQd1c2VyUG9zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQECXdBbW91bnRzQQgFDSR0MDM2NjA2MzY3MTcCXzEECXdBbW91bnRzQggFDSR0MDM2NjA2MzY3MTcCXzIEBWRlYnRzCAUNJHQwMzY2MDYzNjcxNwJfMwQLZXFXQW1vdW50c0EIBQ0kdDAzNjYwNjM2NzE3Al80BAtlcVdBbW91bnRzQggFDSR0MDM2NjA2MzY3MTcCXzUJAJQKAgUDbmlsCQCXCgUFCXdBbW91bnRzQQUJd0Ftb3VudHNCBQVkZWJ0cwULZXFXQW1vdW50c0EFC2VxV0Ftb3VudHNCAWkBCXJlcGxlbmlzaAMEcG9vbAhsZXZlcmFnZQhib3Jyb3dJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwMJAGYCAGQFCGxldmVyYWdlBgkAZgIFCGxldmVyYWdlAKwCCQACAQIfTGV2ZXJhZ2UgY2FuJ3QgYmUgPDEwMCBhbmQgPjMwMAMDCQEBIQEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYW5Cb3Jyb3cJAGYCBQhsZXZlcmFnZQBkBwkAAgECHVlvdSBjYW4ndCBib3Jyb3cgaW4gdGhpcyBwb29sBA0kdDAzNzMxNTM3NDA1CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM3MzE1Mzc0MDUCXzEEA0JJZAgFDSR0MDM3MzE1Mzc0MDUCXzIEBGJhbEEIBQ0kdDAzNzMxNTM3NDA1Al8zBARiYWxCCAUNJHQwMzczMTUzNzQwNQJfNAQHc2hhcmVJZAgFDSR0MDM3MzE1Mzc0MDUCXzUDAwkBAiE9AgUIYm9ycm93SWQFA0FJZAkBAiE9AgUIYm9ycm93SWQFA0JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEDSR0MDM3NDg2Mzc1NDUJARJwYXJzZVJlcGxlbmlzaFBtdHMDCAUBaQhwYXltZW50cwUDQUlkBQNCSWQEBHBtdEEIBQ0kdDAzNzQ4NjM3NTQ1Al8xBARwbXRCCAUNJHQwMzc0ODYzNzU0NQJfMgQEdXNlcgkApQgBCAUBaQZjYWxsZXIECW5ld1Bvc051bQkBGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEFBHVzZXIDCQBmAgUIbGV2ZXJhZ2UAZAQMYm9ycm93QW1vdW50CQEQY2FsY0JvcnJvd0Ftb3VudAYFBHBtdEEFBHBtdEIFA0FJZAUDQklkBQhsZXZlcmFnZQUIYm9ycm93SWQEB3JlcXVlc3QJALkJAgkAzAgCBQR1c2VyCQDMCAIFBHBvb2wJAMwIAgkApAMBBQRwbXRBCQDMCAIFA0FJZAkAzAgCCQCkAwEFBHBtdEIJAMwIAgUDQklkCQDMCAIJAKQDAQUEYmFsQQkAzAgCCQCkAwEFBGJhbEIJAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCCQCkAwEFDGJvcnJvd0Ftb3VudAUDbmlsAgEsBAxuZXdSZXF1ZXN0SWQKAAFACQD8BwQFBHRoaXMCEGNyZWF0ZU5ld1JlcXVlc3QJAMwIAgUHcmVxdWVzdAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDG5ld1JlcXVlc3RJZAUMbmV3UmVxdWVzdElkBARhcmdzCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIFDGJvcnJvd0Ftb3VudAkAzAgCCQClCAEFBHRoaXMJAMwIAgIRcmVwbGVuaXNoRnJvbUxhbmQJAMwIAgkApAMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDG5ld1JlcXVlc3RJZAIYQ2FuJ3QgY3JlYXRlIG5ldyByZXF1ZXN0BQNuaWwEA2ludgkA/QcECQEOZ2V0TGVuZFNydkFkZHIAAg1mbGFzaFBvc2l0aW9uBQRhcmdzBQNuaWwDCQAAAgUDaW52BQNpbnYECnVzZXJTdGFrZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQUNa1VzZXJQb3NpdGlvbgQNJHQwMzg1MzQzODYyOAkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwMzg1MzQzODYyOAUNJHQwMzg1MzQzODYyOAQHbmV3QmFsQggFDSR0MDM4NTM0Mzg2MjgCXzIEB25ld0JhbEEIBQ0kdDAzODUzNDM4NjI4Al8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDM4Njk4Mzg4MTMJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDAzODY5ODM4ODEzAl8xBAh3QW1vdW50QggFDSR0MDM4Njk4Mzg4MTMCXzIJAJQKAgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDM4ODY2Mzg5ODEJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkAwkAAAIFDSR0MDM4ODY2Mzg5ODEFDSR0MDM4ODY2Mzg5ODEEB2F4bHlGZWUIBQ0kdDAzODg2NjM4OTgxAl8yBAp1c2VyU3Rha2VkCAUNJHQwMzg4NjYzODk4MQJfMQQNJHQwMzg5ODczOTA4MQkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwMzg5ODczOTA4MQUNJHQwMzg5ODczOTA4MQQHbmV3QmFsQggFDSR0MDM4OTg3MzkwODECXzIEB25ld0JhbEEIBQ0kdDAzODk4NzM5MDgxAl8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDM5MTUxMzkyNjYJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDAzOTE1MTM5MjY2Al8xBAh3QW1vdW50QggFDSR0MDM5MTUxMzkyNjYCXzIJAJQKAgkAzggCCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFCW5ld1Bvc051bQUHc2hhcmVJZAUFcFR5cGUHCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgQJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwFpARRjcmVhdGVVcGRhdGVTdG9wTG9zcwQFcG9zSWQGcG9vbElkB2Fzc2V0SWQFcHJpY2UJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBnBvb2xJZAIBXwkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAAIBAhpUaGVyZSBhcmUgbm8gdXNlciBwb3NpdGlvbgMJAGcCAAAFBXByaWNlCQACAQIcUHJpY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCBQVwcmljZQUQdG9rZW5PcmFjbGVQcmljZQkAAgECK1ByaWNlIG11c3QgYmUgbGVzcyB0aGFuIGN1cnJlbnQgdG9rZW4gcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUFcHJpY2UFA25pbAFpAQ5kZWxldGVTdG9wTG9zcwMFcG9zSWQGcG9vbElkB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwkAAgECCE5vIGVudHJ5CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUDbmlsAWkBBGluaXQNDG1vbmV5Qm94QWRkcg1zZkZhcm1pbmdBZGRyCGxlbmRBZGRyD3ByaWNlT3JhY2xlQWRkchBrZWVwZXJFeENvbnRyYWN0Dnd4U3dhcENvbnRyYWN0C3N3b3BBc3NldElkCXd4QXNzZXRJZA5vcGVyYXRvclB1YktleRJncm91cDFBZG1pbjFQdWJLZXkSZ3JvdXAxQWRtaW4yUHViS2V5Emdyb3VwMkFkbWluMVB1YktleRJncm91cDJBZG1pbjJQdWJLZXkJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCiCAEFD2tPcGVyYXRvckNhbGxQSwkAAgECDkFscmVhZHkgaW5pdGVkAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQxtb25leUJveEFkZHIJAAIBAiNtb25leUJveEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUNc2ZGYXJtaW5nQWRkcgkAAgECJHNmRmFybWluZ0FkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUIbGVuZEFkZHIJAAIBAh9sZW5kQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ9wcmljZU9yYWNsZUFkZHIJAAIBAiZwcmljZU9yYWNsZUFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUQa2VlcGVyRXhDb250cmFjdAkAAgECJ2tlZXBlckV4Q29udHJhY3QgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQtzd29wQXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFCXd4QXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBAiE9AgkAyAEBCQDZBAEFDm9wZXJhdG9yUHViS2V5ACAJAAIBAh1vcGVyYXRvclB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAkAzAgCCQELU3RyaW5nRW50cnkCBQlrTW9uZXlCb3gFDG1vbmV5Qm94QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ5rU0ZGYXJtaW5nQWRkcgUNc2ZGYXJtaW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrTGVuZFNlcnZpY2UFCGxlbmRBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtQcmljZU9yYWNsZQUPcHJpY2VPcmFjbGVBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2tFeENvbnRyYWN0BRBrZWVwZXJFeENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tXeFN3YXBDb250cmFjdAUOd3hTd2FwQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1N3b3BJZAULc3dvcEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa1d4SWQFCXd4QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rT3BlcmF0b3JDYWxsUEsFDm9wZXJhdG9yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjFQSwUSZ3JvdXAxQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjJQSwUSZ3JvdXAxQWRtaW4yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjFQSwUSZ3JvdXAyQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjJQSwUSZ3JvdXAyQWRtaW4yUHViS2V5BQNuaWwBaQEQY3JlYXRlTmV3UmVxdWVzdAEGcGFyYW1zCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkEDG5ld1JlcXVlc3RJZAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa1JlcXVlc3RJdGVyAAAAAQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkApAMBBQxuZXdSZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFBnBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1JlcXVlc3RJdGVyBQxuZXdSZXF1ZXN0SWQFA25pbAUMbmV3UmVxdWVzdElkAWkBEXJlcGxlbmlzaEZyb21MYW5kAQlyZXF1ZXN0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQNJHQwNDQxMDU0NDIwOQkBDHBhcnNlUmVxdWVzdAEFCXJlcXVlc3RJZAQEdXNlcggFDSR0MDQ0MTA1NDQyMDkCXzEEBHBvb2wIBQ0kdDA0NDEwNTQ0MjA5Al8yBARwbXRBCAUNJHQwNDQxMDU0NDIwOQJfMwQDQUlkCAUNJHQwNDQxMDU0NDIwOQJfNAQEcG10QggFDSR0MDQ0MTA1NDQyMDkCXzUEA0JJZAgFDSR0MDQ0MTA1NDQyMDkCXzYEBGJhbEEIBQ0kdDA0NDEwNTQ0MjA5Al83BARiYWxCCAUNJHQwNDQxMDU0NDIwOQJfOAQHc2hhcmVJZAgFDSR0MDQ0MTA1NDQyMDkCXzkEB2J3QXNzZXQIBQ0kdDA0NDEwNTQ0MjA5A18xMAQIYndBbW91bnQIBQ0kdDA0NDEwNTQ0MjA5A18xMQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdid0Fzc2V0BgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGJ3QW1vdW50CQACAQINV3JvbmcgcGF5bWVudAQNJHQwNDQzOTk0NDQ5OQMJAAACBQNBSWQFB2J3QXNzZXQJAJQKAgkAZAIFBHBtdEEFCGJ3QW1vdW50BQRwbXRCCQCUCgIFBHBtdEEJAGQCBQRwbXRCBQhid0Ftb3VudAQHcG10QWxsQQgFDSR0MDQ0Mzk5NDQ0OTkCXzEEB3BtdEFsbEIIBQ0kdDA0NDM5OTQ0NDk5Al8yBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNDQ1ODE0NDY5NgkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQhMT0FOX0ZFRQUHcG10QWxsQQUDQUlkBQdwbXRBbGxCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQECnVzZXJTdGFrZWQIBQ0kdDA0NDU4MTQ0Njk2Al8xBAdheGx5RmVlCAUNJHQwNDQ1ODE0NDY5NgJfMgQGcG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgQNYm9ycm93RW50cmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAUIYndBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRJrVXNlckJvcnJvd0Fzc2V0SWQFB2J3QXNzZXQFA25pbAQHZW50cmllcwkBEHJlcGxlbmlzaEVudHJpZXMIBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQZwb3NOdW0FB3NoYXJlSWQFBXBUeXBlBgQNJHQwNDUwNTY0NTE3MQkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDQ1MDU2NDUxNzECXzEECHdBbW91bnRCCAUNJHQwNDUwNTY0NTE3MQJfMgkAlAoCCQDNCAIJAM4IAgkAzggCBQdlbnRyaWVzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAUNYm9ycm93RW50cmllcwkBC0RlbGV0ZUVudHJ5AQkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFCnVzZXJTdGFrZWQBaQEJbGlxdWlkYXRlAwR1c2VyBXBvc0lkD2xpcXVpZGF0ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyUG9zaXRpb25Qb29sAgtubyBwb3NpdGlvbgQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDQ1NjkyNDU3ODIJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNDU2OTI0NTc4MgJfMQQDQklkCAUNJHQwNDU2OTI0NTc4MgJfMgQEYmFsQQgFDSR0MDQ1NjkyNDU3ODICXzMEBGJhbEIIBQ0kdDA0NTY5MjQ1NzgyAl80BAdzaGFyZUlkCAUNJHQwNDU2OTI0NTc4MgJfNQQGYW1vdW50CQEJdW5zdGFrZUxQBAUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD2xpcXVpZGF0ZUFtb3VudAQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50BAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBXBvc0lkCQBmAgUMYm9ycm93QW1vdW50AAADCQBmAgUPbGlxdWlkYXRlQW1vdW50BQ91c2VyQ2FuV2l0aGRyYXcJAAIBAidZb3UgY2FuJ3QgbGlxdWlkYXRlIG1vcmUgdGhhbiB1c2VyIGhhdmUDCQAAAgUMYm9ycm93QW1vdW50AAAJAAIBAitZb3UgY2FuJ3QgbGlxdWlkYXRlIHBvc2l0aW9uIHdpdGhvdXQgYm9ycm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZQIJARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAZQIFD3VzZXJDYW5XaXRoZHJhdwUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAFpAQhzdG9wTG9zcwQEdXNlcgVwb3NJZARwb29sB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQNc3RvcExvc3NQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwIITm8gZW50cnkDCQBmAgUQdG9rZW5PcmFjbGVQcmljZQUNc3RvcExvc3NQcmljZQkAAgECI1Rva2VuIHByaWNlIGdyZWF0ZXIgc3RvcCBsb3NzIHByaWNlBANyZXMJAQ53aXRoZHJhd1RvVXNlcgQFBHVzZXIFBHBvb2wJAKQDAQUFcG9zSWQGCQCUCgIJAM0IAggFA3JlcwJfMQkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCAUDcmVzAl8yAWkBDGNhcGl0YWxpemVFeAUEcG9vbAVyb3V0ZQl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEBmNoYW5nZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlAAAEDSR0MDQ3NzUyNDc4NTQJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQUGY2hhbmdlAwkAAAIFDSR0MDQ3NzUyNDc4NTQFDSR0MDQ3NzUyNDc4NTQEDGNsYWltZWRBc3NldAgFDSR0MDQ3NzUyNDc4NTQCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA0Nzc1MjQ3ODU0Al8xBAVyQXJncwkAtQkCBQVyb3V0ZQICX18ED2V4Y2hhbmdlZEFtb3VudAMJAAACCQCRAwIFBXJBcmdzAAACEGRpcmVjdFN3b3BmaUNQTU0JARBkaXJlY3RTd29wZmlDUE1NAgUFckFyZ3MFCXRva2VuVG9JZAMJAAACCQCRAwIFBXJBcmdzAAACDXJvdXRpbmdTd29wZmkJARNkaXJlY3RSb3V0aW5nU3dvcGZpAgUFckFyZ3MFCXRva2VuVG9JZAkAAgECC1dyb25nIHJvdXRlAwkAAAIFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50BAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwFA25pbAkAzggCCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBXBUeXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAULY2hhbmdlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2FwaXRhbGl6ZU5vRXgDBHBvb2wFY2xhaW0RYW1vdW50RnJvbUJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBA0kdDA0ODUzODQ4NjM2CQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEWFtb3VudEZyb21CYWxhbmNlAAADCQAAAgUNJHQwNDg1Mzg0ODYzNgUNJHQwNDg1Mzg0ODYzNgQMY2xhaW1lZEFzc2V0CAUNJHQwNDg1Mzg0ODYzNgJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDQ4NTM4NDg2MzYCXzEJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUJAQxhc3NldElkVG9TdHIBBQxjbGFpbWVkQXNzZXQJAGQCBQ1jbGFpbWVkQW1vdW50BRFhbW91bnRGcm9tQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtpbml0TmV3UG9vbAoEdHlwZQhwb29sVHlwZQhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JY2FuQm9ycm93CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwMJAQIhPQIFBHR5cGUFB1NGX1BPT0wJAQIhPQIFBHR5cGUFB1dYX1BPT0wHCQACAQIKV3JvbmcgdHlwZQMDCQECIT0CBQhwb29sVHlwZQUEQ1BNTQkBAiE9AgUIcG9vbFR5cGUFBEZMQVQHCQACAQIPV3JvbmcgcG9vbCB0eXBlBA0kdDA0OTE1NzQ5MjUxCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUIcG9vbEFkZHIFBHR5cGUEA2FJZAgFDSR0MDQ5MTU3NDkyNTECXzEEA2JJZAgFDSR0MDQ5MTU3NDkyNTECXzIEBGFCYWwIBQ0kdDA0OTE1NzQ5MjUxAl8zBARiQmFsCAUNJHQwNDkxNTc0OTI1MQJfNAQHc2hhcmVJZAgFDSR0MDQ5MTU3NDkyNTECXzUDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtQb29sSW50ZXJlc3RMb2FuAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBWtQb29sBQhwb29sQWRkcgUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wFCHBvb2xBZGRyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ5rUG9vbENhbkJvcnJvdwUJY2FuQm9ycm93BQNuaWwBaQEOdXBkYXRlUG9vbEZlZXMHCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUIcG9vbEFkZHIJAAIBCQCsAgICGkNhbid0IGZpbmQgcG9vbCB3aXRoIGFkZHIgBQhwb29sQWRkcgMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgUDbmlsAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhNkQXBwIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgUDbmlsAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECFWRBcHAgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcFA25pbAFpARBhY3RpdmF0ZUZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECHWRBcHAgYWxyZWFkeSBhY3RpdmUgZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMGBQNuaWwBaQEQc2h1dGRvd25Gb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECH2RBcHAgYWxyZWFkeSBzaHV0ZG93biBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwcFA25pbAFpAQphY3RpdmF0ZVNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhVTV09QRkkgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25TRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhdTV09QRkkgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQphY3RpdmF0ZVdYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhFXWCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93bldYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECE1dYIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEMYWN0aXZhdGVQb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECE1Bvb2wgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGBQNuaWwBaQEMc2h1dGRvd25Qb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQIVUG9vbCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBwUDbmlsACKaMMA=", "height": 2803849, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5W8me79ju9vr22gKggeGKTHUvDDc2gnGH7wsLsZTbiku Next: DSF66GStJe5vyjV8emZZXmJMmJsMeG52mGBqK5ABjmrd Diff:
OldNewDifferences
44 let SF_POOL = "SF"
55
66 let WX_POOL = "WX"
7+
8+let CPMM = "cpmm"
9+
10+let FLAT = "flat"
711
812 let CAP_FEE_NO_LOAN = "capNoLoan"
913
99103
100104 let kUserStopLoss = "_stopLoss"
101105
106+let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
107+
102108 let kMoneyBox = "axly_money_box"
103109
104110 let kSFFarmingAddr = "swopfi_farming_addr"
153159 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
154160
155161
156-func isOperatorCall (i) = if ((i.callerPublicKey == i.callerPublicKey))
162+func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
157163 then unit
158164 else throw("Only operator can call this function")
159165
160166
161-func isAdminCall (i) = if (if ((i.callerPublicKey == i.callerPublicKey))
167+func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
162168 then true
163- else (i.callerPublicKey == i.callerPublicKey))
169+ else (i.callerPublicKey == group1Admin2PK))
164170 then unit
165171 else throw("Only admin group1 can call this function")
166172
232238
233239
234240 func getSFPoolData (poolAddr) = {
235- let $t079127961 = getSFPoolBalances(poolAddr)
236- if (($t079127961 == $t079127961))
241+ let $t080238072 = getSFPoolBalances(poolAddr)
242+ if (($t080238072 == $t080238072))
237243 then {
238- let balB = $t079127961._2
239- let balA = $t079127961._1
244+ let balB = $t080238072._2
245+ let balA = $t080238072._1
240246 $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"))
241247 }
242248 else throw("Strict value is not equal to itself.")
270276 then @
271277 else unit
272278 }, "Can't get pool LP asset id")
273- let $t086588717 = getWXPoolBalances(poolAddr, aId, bId)
274- if (($t086588717 == $t086588717))
279+ let $t087698828 = getWXPoolBalances(poolAddr, aId, bId)
280+ if (($t087698828 == $t087698828))
275281 then {
276- let balB = $t086588717._2
277- let balA = $t086588717._1
282+ let balB = $t087698828._2
283+ let balA = $t087698828._1
278284 $Tuple5(aId, bId, balA, balB, shareId)
279285 }
280286 else throw("Strict value is not equal to itself.")
382388 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
383389 let poolAddr = Address(fromBase58String(pool))
384390 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
385- let $t01170611771 = getPoolData(poolAddr, pType)
386- let aId = $t01170611771._1
387- let bId = $t01170611771._2
388- let aBalance = $t01170611771._3
389- let bBalance = $t01170611771._4
391+ let $t01181711882 = getPoolData(poolAddr, pType)
392+ let aId = $t01181711882._1
393+ let bId = $t01181711882._2
394+ let aBalance = $t01181711882._3
395+ let bBalance = $t01181711882._4
390396 let prices = getAssetsPrice([aId, bId])
391397 let dPriceA = prices[0]
392398 let dPriceB = prices[1]
465471 }
466472 else if ((pType == WX_POOL))
467473 then {
468- let $t01331513565 = $Tuple2(split({
474+ let $t01342613676 = $Tuple2(split({
469475 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
470476 if ($isInstanceOf(@, "String"))
471477 then @
476482 then @
477483 else throw(($getType(@) + " couldn't be cast to String"))
478484 }, "__"))
479- if (($t01331513565 == $t01331513565))
485+ if (($t01342613676 == $t01342613676))
480486 then {
481- let evalPutInB = $t01331513565._2
482- let evalPutInA = $t01331513565._1
487+ let evalPutInB = $t01342613676._2
488+ let evalPutInA = $t01342613676._1
483489 let lpInA = parseIntValue(evalPutInA[1])
484490 let lpInB = parseIntValue(evalPutInB[1])
485491 if ((lpInB > lpInA))
528534
529535
530536 func unstakeLP (pool,pType,shareId,amount) = {
531- let $t01522415574 = if ((pType == SF_POOL))
537+ let $t01533515685 = if ((pType == SF_POOL))
532538 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
533539 else if ((pType == WX_POOL))
534540 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
535541 else unknownPoolType()
536- let farmAddr = $t01522415574._1
537- let fName = $t01522415574._2
538- let params = $t01522415574._3
542+ let farmAddr = $t01533515685._1
543+ let fName = $t01533515685._2
544+ let params = $t01533515685._3
539545 let inv = invoke(farmAddr, fName, params, nil)
540546 if ((inv == inv))
541547 then amount
548554 let feeScale6 = 1000000
549555 let fee = getIntegerValue(poolAddr, kSFPoolFee)
550556 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
551- let $t01599616302 = if ((assetTokenToGet == assetIdA))
557+ let $t01610716413 = if ((assetTokenToGet == assetIdA))
552558 then {
553559 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
554560 $Tuple2(amountToPay, assetIdB)
557563 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
558564 $Tuple2(amountToPay, assetIdA)
559565 }
560- let amountToPay = $t01599616302._1
561- let assetToPay = $t01599616302._2
566+ let amountToPay = $t01610716413._1
567+ let assetToPay = $t01610716413._2
562568 $Tuple2(assetToPay, amountToPay)
563569 }
564570
578584
579585
580586 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
581- let $t01704217081 = getWXSwapFees(pool)
582- let pFee = $t01704217081._1
583- let prFee = $t01704217081._2
587+ let $t01715317192 = getWXSwapFees(pool)
588+ let pFee = $t01715317192._1
589+ let prFee = $t01715317192._2
584590 let feeScale = toBigInt(100000000)
585- let $t01712117429 = if ((assetTokenToGet == assetIdA))
591+ let $t01723217540 = if ((assetTokenToGet == assetIdA))
586592 then {
587593 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
588594 $Tuple2(amountToPay, assetIdB)
591597 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
592598 $Tuple2(amountToPay, assetIdA)
593599 }
594- let amountToPay = $t01712117429._1
595- let assetToPay = $t01712117429._2
600+ let amountToPay = $t01723217540._1
601+ let assetToPay = $t01723217540._2
596602 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
597603 $Tuple2(assetToPay, amountToPayWithFee)
598604 }
599605
600606
601-func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((pType == SF_POOL))
602- then {
603- let $t01777617898 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604- let assetToPay = $t01777617898._1
605- let amountToPay = $t01777617898._2
606- invoke(addressFromStringValue(pool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
607- }
608- else if ((pType == WX_POOL))
607+func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
608+ let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
609+ if (if ((pType == SF_POOL))
610+ then true
611+ else (poolFB != ""))
609612 then {
610- let $t01809818220 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
611- let assetToPay = $t01809818220._1
612- let amountToPay = $t01809818220._2
613- invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
613+ let $t01798118193 = if ((poolFB == ""))
614+ then $Tuple3(balA, balB, pool)
615+ else {
616+ let $t01808718160 = getSFPoolBalances(addressFromStringValue(poolFB))
617+ let sfBalA = $t01808718160._1
618+ let sfBalB = $t01808718160._2
619+ $Tuple3(sfBalA, sfBalB, poolFB)
620+ }
621+ let pBalA = $t01798118193._1
622+ let pBalB = $t01798118193._2
623+ let exPool = $t01798118193._3
624+ let $t01819818324 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
625+ let assetToPay = $t01819818324._1
626+ let amountToPay = $t01819818324._2
627+ invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
614628 }
615- else unknownPoolType()
629+ else if ((pType == WX_POOL))
630+ then {
631+ let $t01852618648 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
632+ let assetToPay = $t01852618648._1
633+ let amountToPay = $t01852618648._2
634+ invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
635+ }
636+ else unknownPoolType()
637+ }
616638
617639
618640 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
619- let $t01850718971 = if ((pType == SF_POOL))
641+ let $t01893519399 = if ((pType == SF_POOL))
620642 then {
621643 let inv = {
622644 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
651673 else throw("Strict value is not equal to itself.")
652674 }
653675 else unknownPoolType()
654- let amountA = $t01850718971._1
655- let amountB = $t01850718971._2
676+ let amountA = $t01893519399._1
677+ let amountB = $t01893519399._2
656678 $Tuple2(amountA, amountB)
657679 }
658680
674696 }
675697 else if ((pType == WX_POOL))
676698 then {
677- let $t01933919418 = getWXPoolData(addressFromStringValue(pool))
678- let aId = $t01933919418._1
679- let bId = $t01933919418._2
680- let aBal = $t01933919418._3
681- let bBal = $t01933919418._4
682- let lpId = $t01933919418._5
699+ let $t01976719846 = getWXPoolData(addressFromStringValue(pool))
700+ let aId = $t01976719846._1
701+ let bId = $t01976719846._2
702+ let aBal = $t01976719846._3
703+ let bBal = $t01976719846._4
704+ let lpId = $t01976719846._5
683705 let balBefore = accountBalance(WXID)
684706 if ((balBefore == balBefore))
685707 then {
701723 if ((lpBalanceBefore == lpBalanceBefore))
702724 then {
703725 let poolAddr = addressFromStringValue(pool)
704- let $t02001620432 = if (if ((pmtA > 0))
726+ let $t02044420860 = if (if ((pmtA > 0))
705727 then (pmtB > 0)
706728 else false)
707729 then {
708- let $t02008220198 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
709- let pmtInA = $t02008220198._1
710- let pmtInB = $t02008220198._2
711- let change = $t02008220198._3
712- let changeId = $t02008220198._4
730+ let $t02051020626 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
731+ let pmtInA = $t02051020626._1
732+ let pmtInB = $t02051020626._2
733+ let change = $t02051020626._3
734+ let changeId = $t02051020626._4
713735 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
714736 if ((inv == inv))
715737 then $Tuple2(change, changeId)
720742 else if ((pmtB > 0))
721743 then $Tuple2(pmtB, bId)
722744 else throw("pmts must be > 0")
723- let change = $t02001620432._1
724- let changeId = $t02001620432._2
745+ let change = $t02044420860._1
746+ let changeId = $t02044420860._2
725747 let inv = if ((change > 0))
726748 then replenishOneTokenByType(poolAddr, pType, change, changeId)
727749 else nil
749771 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
750772 let totalAmount = getPoolTotalShare(pool)
751773 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
752- let $t02128921527 = if (withLoan)
774+ let $t02171721955 = if (withLoan)
753775 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
754776 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
755- let curPoolInterest = $t02128921527._1
756- let totalStakedWithLoan = $t02128921527._2
777+ let curPoolInterest = $t02171721955._1
778+ let totalStakedWithLoan = $t02171721955._2
757779 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), 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))]
758780 }
759781
760782
761-func exchangeKeeper (toToken,pmtAmount,pmtAsset,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
762- let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
783+func listToInt (a,item) = (a :+ parseIntValue(item))
784+
785+
786+func directSwopfiCPMM (rArgs,tokenTo) = {
787+ let dApp = addressFromStringValue(rArgs[1])
788+ let pmtP = split(rArgs[2], "|")
789+ let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
763790 if ((tokenBalanceBefore == tokenBalanceBefore))
764791 then {
765- let inv = invoke(exContract, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [AttachedPayment(pmtAsset, pmtAmount)])
792+ let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
793+ let minToRecive = rArgs[3]
794+ let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
766795 if ((inv == inv))
767- then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
796+ then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
768797 else throw("Strict value is not equal to itself.")
769798 }
770799 else throw("Strict value is not equal to itself.")
771800 }
772801
773802
774-func exchangePuzzle (toToken,pmtAmount,pmtAsset,routesStr,minToReceive,options) = {
775- let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
803+func directRoutingSwopfi (rArgs,tokenTo) = {
804+ let dApp = addressFromStringValue(rArgs[1])
805+ let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
776806 if ((tokenBalanceBefore == tokenBalanceBefore))
777807 then {
778- let inv = invoke(exContract, "puzzleSwap", [routesStr, minToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
808+ let pmt = {
809+ let pmtP = split(rArgs[2], "|")
810+[AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
811+ }
812+ let args = {
813+ let eArgs = split(rArgs[3], "|")
814+ let exchangers = split(eArgs[0], ",")
815+ let exchangersType = split(eArgs[1], ",")
816+ let args1 = {
817+ let $l = split(eArgs[2], ",")
818+ let $s = size($l)
819+ let $acc0 = nil
820+ func $f0_1 ($a,$i) = if (($i >= $s))
821+ then $a
822+ else listToInt($a, $l[$i])
823+
824+ func $f0_2 ($a,$i) = if (($i >= $s))
825+ then $a
826+ else throw("List size exceeds 3")
827+
828+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
829+ }
830+ let args2 = {
831+ let $l = split(eArgs[3], ",")
832+ let $s = size($l)
833+ let $acc0 = nil
834+ func $f1_1 ($a,$i) = if (($i >= $s))
835+ then $a
836+ else listToInt($a, $l[$i])
837+
838+ func $f1_2 ($a,$i) = if (($i >= $s))
839+ then $a
840+ else throw("List size exceeds 3")
841+
842+ $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
843+ }
844+ let routingAssetsKeys = split(eArgs[4], ",")
845+ let minToRecive = parseIntValue(eArgs[5])
846+[exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
847+ }
848+ let inv = invoke(dApp, "routingTrade", args, pmt)
779849 if ((inv == inv))
780- then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
781- else throw("Strict value is not equal to itself.")
782- }
783- else throw("Strict value is not equal to itself.")
784- }
785-
786-
787-func exchangeSwopFi (toToken,pmtAmount,pmtAsset,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
788- let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
789- if ((tokenBalanceBefore == tokenBalanceBefore))
790- then {
791- let inv = invoke(exContract, "swopfiSwap", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
792- if ((inv == inv))
793- then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
850+ then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
794851 else throw("Strict value is not equal to itself.")
795852 }
796853 else throw("Strict value is not equal to itself.")
799856
800857 func capitalize (pool,pType,tokenId,tokenAmount) = {
801858 let poolAddr = Address(fromBase58String(pool))
802- let $t02388123947 = getPoolData(poolAddr, pType)
803- let AId = $t02388123947._1
804- let BId = $t02388123947._2
805- let balA = $t02388123947._3
806- let balB = $t02388123947._4
807- let shareId = $t02388123947._5
859+ let $t02406224128 = getPoolData(poolAddr, pType)
860+ let AId = $t02406224128._1
861+ let BId = $t02406224128._2
862+ let balA = $t02406224128._3
863+ let balB = $t02406224128._4
864+ let shareId = $t02406224128._5
808865 if (if ((tokenId != AId))
809866 then (tokenId != BId)
810867 else false)
811868 then throw("Wrong asset")
812869 else {
813870 let totalShareAmount = getPoolTotalShare(pool)
814- let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
815- let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
816- let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
817- let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
818- let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
819- let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
820- let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
821- let $t02458724687 = if ((tokenId == AId))
822- then $Tuple2((tokenAmount - axlyFee), 0)
823- else $Tuple2(0, (tokenAmount - axlyFee))
824- let pmtA = $t02458724687._1
825- let pmtB = $t02458724687._2
826- let $t02469024794 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
827- let stakedAmount = $t02469024794._1
828- let nf = $t02469024794._2
829- let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
830- let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
831- let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
832- let stakedNoLoan = (stakedAmount - stakedLoan)
833- let newInterestLoan = if ((totalShareAmountWithLoan > 0))
834- then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
835- else 0
836- let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
837- then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
838- else 0
839- ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, fromBase58String(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
871+ if ((totalShareAmount == 0))
872+ then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
873+ else {
874+ let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
875+ let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
876+ let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
877+ let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
878+ let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
879+ let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
880+ let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
881+ let $t02487324973 = if ((tokenId == AId))
882+ then $Tuple2((tokenAmount - axlyFee), 0)
883+ else $Tuple2(0, (tokenAmount - axlyFee))
884+ let pmtA = $t02487324973._1
885+ let pmtB = $t02487324973._2
886+ let $t02497625080 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
887+ let stakedAmount = $t02497625080._1
888+ let nf = $t02497625080._2
889+ let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
890+ let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
891+ let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
892+ let stakedNoLoan = (stakedAmount - stakedLoan)
893+ let newInterestLoan = if ((totalShareAmountWithLoan > 0))
894+ then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
895+ else 0
896+ let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
897+ then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
898+ else 0
899+ ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
900+ }
840901 }
841902 }
842903
870931 let userAddr = Address(fromBase58String(user))
871932 let poolAddr = Address(fromBase58String(pool))
872933 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
873- let $t02732527397 = getPoolData(poolAddr, pType)
874- let idAStr = $t02732527397._1
875- let idBStr = $t02732527397._2
876- let balA = $t02732527397._3
877- let balB = $t02732527397._4
878- let shareId = $t02732527397._5
879- let $t02740027467 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
880- let idA = $t02740027467._1
881- let idB = $t02740027467._2
934+ let $t02760927681 = getPoolData(poolAddr, pType)
935+ let idAStr = $t02760927681._1
936+ let idBStr = $t02760927681._2
937+ let balA = $t02760927681._3
938+ let balB = $t02760927681._4
939+ let shareId = $t02760927681._5
940+ let $t02768427751 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
941+ let idA = $t02768427751._1
942+ let idB = $t02768427751._2
882943 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
883944 let cBalABefore = accountBalance(idA)
884945 if ((cBalABefore == cBalABefore))
909970 let cBalBAfter = accountBalance(idB)
910971 if ((cBalBAfter == cBalBAfter))
911972 then {
912- let $t02816228251 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
913- let tokensAmountA = $t02816228251._1
914- let tokensAmountB = $t02816228251._2
915- let $t02825429490 = if (isBorrowed)
973+ let $t02844628535 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
974+ let tokensAmountA = $t02844628535._1
975+ let tokensAmountB = $t02844628535._2
976+ let $t02853829774 = if (isBorrowed)
916977 then {
917978 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
918979 let debt = {
9611022 else throw("Strict value is not equal to itself.")
9621023 }
9631024 else $Tuple2(tokensAmountA, tokensAmountB)
964- let toUserA = $t02825429490._1
965- let toUserB = $t02825429490._2
1025+ let toUserA = $t02853829774._1
1026+ let toUserB = $t02853829774._2
9661027 let poolTotalLoanEntries = if (isBorrowed)
9671028 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
9681029 else nil
10081069 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10091070 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10101071 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1011- let $t03147231569 = if ((borrowId == aId))
1072+ let $t03175631853 = if ((borrowId == aId))
10121073 then $Tuple2(dPriceA, decPrA)
10131074 else $Tuple2(dPriceB, decPrB)
1014- let borrowPrice = $t03147231569._1
1015- let borrowDecPr = $t03147231569._2
1075+ let borrowPrice = $t03175631853._1
1076+ let borrowDecPr = $t03175631853._2
10161077 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10171078 }
10181079
10411102
10421103
10431104 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1044- let $t03256932828 = if (claim)
1105+ let $t03285333115 = if (claim)
10451106 then claimFarmed(pType, pool)
10461107 else {
10471108 let claimedAsset = if ((pType == SF_POOL))
10511112 else unknownPoolType()
10521113 $Tuple2(amount, claimedAsset)
10531114 }
1054- let claimAmount = $t03256932828._1
1055- let claimAsset = $t03256932828._2
1056- let bal = accountBalance(claimAsset)
1057- if (if ((amount > (claimAmount + change)))
1058- then true
1059- else (amount > bal))
1060- then throw("To big amount to exchange")
1061- else $Tuple2(claimAmount, claimAsset)
1115+ if (($t03285333115 == $t03285333115))
1116+ then {
1117+ let claimAsset = $t03285333115._2
1118+ let claimAmount = $t03285333115._1
1119+ let bal = accountBalance(claimAsset)
1120+ if ((bal == bal))
1121+ then if ((amount > bal))
1122+ then throw("To big amount to exchange")
1123+ else $Tuple2(claimAmount, claimAsset)
1124+ else throw("Strict value is not equal to itself.")
1125+ }
1126+ else throw("Strict value is not equal to itself.")
10621127 }
10631128
10641129
10661131 func getPoolInfoREADONLY (pool) = {
10671132 let poolAddr = addressFromStringValue(pool)
10681133 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1069- let $t03322533315 = getPoolData(Address(fromBase58String(pool)), pType)
1070- let AId = $t03322533315._1
1071- let BId = $t03322533315._2
1072- let balA = $t03322533315._3
1073- let balB = $t03322533315._4
1074- let shareId = $t03322533315._5
1134+ let $t03348233572 = getPoolData(Address(fromBase58String(pool)), pType)
1135+ let AId = $t03348233572._1
1136+ let BId = $t03348233572._2
1137+ let balA = $t03348233572._3
1138+ let balB = $t03348233572._4
1139+ let shareId = $t03348233572._5
10751140 let shareSupply = getShareSupply(poolAddr, pType, shareId)
10761141 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
10771142 }
10991164 @Callable(i)
11001165 func getUserPositionREADONLY (user,pools,posNum) = {
11011166 func userPos (a,pool) = {
1102- let $t03418834258 = a
1103- let wAmountsA = $t03418834258._1
1104- let wAmountsB = $t03418834258._2
1105- let debts = $t03418834258._3
1106- let eqWAmountsA = $t03418834258._4
1107- let eqWAmountsB = $t03418834258._5
1108- let index = $t03418834258._6
1167+ let $t03444534515 = a
1168+ let wAmountsA = $t03444534515._1
1169+ let wAmountsB = $t03444534515._2
1170+ let debts = $t03444534515._3
1171+ let eqWAmountsA = $t03444534515._4
1172+ let eqWAmountsB = $t03444534515._5
1173+ let index = $t03444534515._6
11091174 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11101175 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11111176 else {
11121177 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1113- let $t03453734627 = getPoolData(Address(fromBase58String(pool)), pType)
1114- let AId = $t03453734627._1
1115- let BId = $t03453734627._2
1116- let balA = $t03453734627._3
1117- let balB = $t03453734627._4
1118- let shareId = $t03453734627._5
1178+ let $t03479434884 = getPoolData(Address(fromBase58String(pool)), pType)
1179+ let AId = $t03479434884._1
1180+ let BId = $t03479434884._2
1181+ let balA = $t03479434884._3
1182+ let balB = $t03479434884._4
1183+ let shareId = $t03479434884._5
11191184 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11201185 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1121- let $t03484334963 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1122- let wAmountA = $t03484334963._1
1123- let wAmountB = $t03484334963._2
1186+ let $t03510035220 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1187+ let wAmountA = $t03510035220._1
1188+ let wAmountB = $t03510035220._2
11241189 if ((borrowAmount > 0))
11251190 then {
11261191 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11541219 }
11551220 else unknownPoolType()
11561221 else 0
1157- let $t03587536094 = if ((borrowAsset == AId))
1222+ let $t03613236351 = if ((borrowAsset == AId))
11581223 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
11591224 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1160- let eqWAmountA = $t03587536094._1
1161- let eqWAmountB = $t03587536094._2
1225+ let eqWAmountA = $t03613236351._1
1226+ let eqWAmountB = $t03613236351._2
11621227 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
11631228 }
11641229 else throw("Strict value is not equal to itself.")
11671232 }
11681233 }
11691234
1170- let $t03634936460 = {
1235+ let $t03660636717 = {
11711236 let $l = pools
11721237 let $s = size($l)
11731238 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
11811246
11821247 $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)
11831248 }
1184- let wAmountsA = $t03634936460._1
1185- let wAmountsB = $t03634936460._2
1186- let debts = $t03634936460._3
1187- let eqWAmountsA = $t03634936460._4
1188- let eqWAmountsB = $t03634936460._5
1249+ let wAmountsA = $t03660636717._1
1250+ let wAmountsB = $t03660636717._2
1251+ let debts = $t03660636717._3
1252+ let eqWAmountsA = $t03660636717._4
1253+ let eqWAmountsB = $t03660636717._5
11891254 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
11901255 }
11911256
12051270 else false)
12061271 then throw("You can't borrow in this pool")
12071272 else {
1208- let $t03705837148 = getPoolData(Address(fromBase58String(pool)), pType)
1209- let AId = $t03705837148._1
1210- let BId = $t03705837148._2
1211- let balA = $t03705837148._3
1212- let balB = $t03705837148._4
1213- let shareId = $t03705837148._5
1273+ let $t03731537405 = getPoolData(Address(fromBase58String(pool)), pType)
1274+ let AId = $t03731537405._1
1275+ let BId = $t03731537405._2
1276+ let balA = $t03731537405._3
1277+ let balB = $t03731537405._4
1278+ let shareId = $t03731537405._5
12141279 if (if ((borrowId != AId))
12151280 then (borrowId != BId)
12161281 else false)
12171282 then throw("Wrong borrow asset")
12181283 else {
1219- let $t03722937288 = parseReplenishPmts(i.payments, AId, BId)
1220- let pmtA = $t03722937288._1
1221- let pmtB = $t03722937288._2
1284+ let $t03748637545 = parseReplenishPmts(i.payments, AId, BId)
1285+ let pmtA = $t03748637545._1
1286+ let pmtB = $t03748637545._2
12221287 let user = toString(i.caller)
12231288 let newPosNum = getNewUserPositionNumber(user)
12241289 if ((leverage > 100))
12381303 if ((inv == inv))
12391304 then {
12401305 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1241- let $t03827738371 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1242- if (($t03827738371 == $t03827738371))
1306+ let $t03853438628 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1307+ if (($t03853438628 == $t03853438628))
12431308 then {
1244- let newBalB = $t03827738371._2
1245- let newBalA = $t03827738371._1
1309+ let newBalB = $t03853438628._2
1310+ let newBalA = $t03853438628._1
12461311 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1247- let $t03844138556 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1248- let wAmountA = $t03844138556._1
1249- let wAmountB = $t03844138556._2
1312+ let $t03869838813 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1313+ let wAmountA = $t03869838813._1
1314+ let wAmountB = $t03869838813._2
12501315 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
12511316 }
12521317 else throw("Strict value is not equal to itself.")
12561321 else throw("Strict value is not equal to itself.")
12571322 }
12581323 else {
1259- let $t03860938724 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1260- if (($t03860938724 == $t03860938724))
1324+ let $t03886638981 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1325+ if (($t03886638981 == $t03886638981))
12611326 then {
1262- let axlyFee = $t03860938724._2
1263- let userStaked = $t03860938724._1
1264- let $t03873038824 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1265- if (($t03873038824 == $t03873038824))
1327+ let axlyFee = $t03886638981._2
1328+ let userStaked = $t03886638981._1
1329+ let $t03898739081 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1330+ if (($t03898739081 == $t03898739081))
12661331 then {
1267- let newBalB = $t03873038824._2
1268- let newBalA = $t03873038824._1
1332+ let newBalB = $t03898739081._2
1333+ let newBalA = $t03898739081._1
12691334 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1270- let $t03889439009 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1271- let wAmountA = $t03889439009._1
1272- let wAmountB = $t03889439009._2
1335+ let $t03915139266 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1336+ let wAmountA = $t03915139266._1
1337+ let wAmountB = $t03915139266._2
12731338 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
12741339 }
12751340 else throw("Strict value is not equal to itself.")
13621427
13631428 @Callable(i)
13641429 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1365- let $t04384843952 = parseRequest(requestId)
1366- let user = $t04384843952._1
1367- let pool = $t04384843952._2
1368- let pmtA = $t04384843952._3
1369- let AId = $t04384843952._4
1370- let pmtB = $t04384843952._5
1371- let BId = $t04384843952._6
1372- let balA = $t04384843952._7
1373- let balB = $t04384843952._8
1374- let shareId = $t04384843952._9
1375- let bwAsset = $t04384843952._10
1376- let bwAmount = $t04384843952._11
1430+ let $t04410544209 = parseRequest(requestId)
1431+ let user = $t04410544209._1
1432+ let pool = $t04410544209._2
1433+ let pmtA = $t04410544209._3
1434+ let AId = $t04410544209._4
1435+ let pmtB = $t04410544209._5
1436+ let BId = $t04410544209._6
1437+ let balA = $t04410544209._7
1438+ let balB = $t04410544209._8
1439+ let shareId = $t04410544209._9
1440+ let bwAsset = $t04410544209._10
1441+ let bwAmount = $t04410544209._11
13771442 if ((size(i.payments) != 1))
13781443 then throw("Wrong payment size")
13791444 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
13811446 else (i.payments[0].amount != bwAmount))
13821447 then throw("Wrong payment")
13831448 else {
1384- let $t04414244242 = if ((AId == bwAsset))
1449+ let $t04439944499 = if ((AId == bwAsset))
13851450 then $Tuple2((pmtA + bwAmount), pmtB)
13861451 else $Tuple2(pmtA, (pmtB + bwAmount))
1387- let pmtAllA = $t04414244242._1
1388- let pmtAllB = $t04414244242._2
1452+ let pmtAllA = $t04439944499._1
1453+ let pmtAllB = $t04439944499._2
13891454 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1390- let $t04432444439 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1391- let userStaked = $t04432444439._1
1392- let axlyFee = $t04432444439._2
1455+ let $t04458144696 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1456+ let userStaked = $t04458144696._1
1457+ let axlyFee = $t04458144696._2
13931458 let posNum = getNewUserPositionNumber(user)
13941459 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
13951460 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1396- let $t04479944914 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1397- let wAmountA = $t04479944914._1
1398- let wAmountB = $t04479944914._2
1461+ let $t04505645171 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1462+ let wAmountA = $t04505645171._1
1463+ let wAmountB = $t04505645171._2
13991464 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14001465 }
14011466 }))
14061471 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14071472 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14081473 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1409- let $t04543545525 = getPoolData(Address(fromBase58String(pool)), pType)
1410- let AId = $t04543545525._1
1411- let BId = $t04543545525._2
1412- let balA = $t04543545525._3
1413- let balB = $t04543545525._4
1414- let shareId = $t04543545525._5
1474+ let $t04569245782 = getPoolData(Address(fromBase58String(pool)), pType)
1475+ let AId = $t04569245782._1
1476+ let BId = $t04569245782._2
1477+ let balA = $t04569245782._3
1478+ let balB = $t04569245782._4
1479+ let shareId = $t04569245782._5
14151480 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14161481 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14171482 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
14401505
14411506
14421507 @Callable(i)
1443-func capitalizeExKeeper (pool,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
1508+func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14441509 let pType = getStringValue(this, (kPool + pool))
14451510 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1446- let $t04767447773 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1447- let claimedAmount = $t04767447773._1
1448- let claimedAsset = $t04767447773._2
1449- let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
1450- let newChange = ((claimedAmount + change) - amountToExchange)
1451- let changeEntry = if ((newChange >= 0))
1452- then [IntegerEntry((pool + kPoolCapChange), newChange)]
1453- else throw("Negative change")
1454- (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
1455- }))
1456-
1457-
1458-
1459-@Callable(i)
1460-func capitalizeExPuzzle (pool,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
1461- let pType = getStringValue(this, (kPool + pool))
1462- let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1463- let $t04857348672 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1464- let claimedAmount = $t04857348672._1
1465- let claimedAsset = $t04857348672._2
1466- let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
1467- let newChange = ((claimedAmount + change) - amountToExchange)
1468- let changeEntry = if ((newChange >= 0))
1469- then [IntegerEntry((pool + kPoolCapChange), newChange)]
1470- else nil
1471- (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
1472- }))
1473-
1474-
1475-
1476-@Callable(i)
1477-func capitalizeExSwopFi (pool,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
1478- let pType = getStringValue(this, (kPool + pool))
1479- let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1480- let $t04951749616 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1481- let claimedAmount = $t04951749616._1
1482- let claimedAsset = $t04951749616._2
1483- let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
1484- let newChange = ((claimedAmount + change) - amountToExchange)
1485- let changeEntry = if ((newChange >= 0))
1486- then [IntegerEntry((pool + kPoolCapChange), newChange)]
1487- else nil
1488- (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
1511+ let $t04775247854 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1512+ if (($t04775247854 == $t04775247854))
1513+ then {
1514+ let claimedAsset = $t04775247854._2
1515+ let claimedAmount = $t04775247854._1
1516+ let rArgs = split(route, "__")
1517+ let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
1518+ then directSwopfiCPMM(rArgs, tokenToId)
1519+ else if ((rArgs[0] == "routingSwopfi"))
1520+ then directRoutingSwopfi(rArgs, tokenToId)
1521+ else throw("Wrong route")
1522+ if ((exchangedAmount == exchangedAmount))
1523+ then {
1524+ let newChange = ((claimedAmount + change) - amountToExchange)
1525+ let changeEntry = if ((newChange >= 0))
1526+ then [IntegerEntry((pool + kPoolCapChange), newChange)]
1527+ else nil
1528+ (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
1529+ }
1530+ else throw("Strict value is not equal to itself.")
1531+ }
1532+ else throw("Strict value is not equal to itself.")
14891533 }))
14901534
14911535
14931537 @Callable(i)
14941538 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14951539 let pType = getStringValue(this, (kPool + pool))
1496- let $t05021350308 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1497- let claimedAmount = $t05021350308._1
1498- let claimedAsset = $t05021350308._2
1499- capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
1540+ let $t04853848636 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1541+ if (($t04853848636 == $t04853848636))
1542+ then {
1543+ let claimedAsset = $t04853848636._2
1544+ let claimedAmount = $t04853848636._1
1545+ capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
1546+ }
1547+ else throw("Strict value is not equal to itself.")
15001548 }))
15011549
15021550
15031551
15041552 @Callable(i)
1505-func initNewPool (type,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
1553+func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
15061554 then (type != WX_POOL)
15071555 else false)
15081556 then throw("Wrong type")
1509- else {
1510- let $t05073450828 = getPoolData(Address(fromBase58String(poolAddr)), type)
1511- let aId = $t05073450828._1
1512- let bId = $t05073450828._2
1513- let aBal = $t05073450828._3
1514- let bBal = $t05073450828._4
1515- let shareId = $t05073450828._5
1516- if ((0 > inFeeNoLoan))
1517- then throw("inFeeNoLoan must be greater than 0")
1518- else if ((0 > inFeeLoan))
1519- then throw("inFeeLoan must be greater than 0")
1520- else if ((0 > capFeeNoLoan))
1521- then throw("capFeeNoLoan must be greater than 0")
1522- else if ((0 > capFeeWithLoan))
1523- then throw("capFeeWithLoan must be greater than 0")
1524- else if ((0 > stoplossFeeNoLoan))
1525- then throw("stoplossFeeNoLoan must be greater than 0")
1526- else if ((0 > stoplossFeeWithLoan))
1527- then throw("stoplossFeeWithLoan must be greater than 0")
1528- else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
1529- }))
1557+ else if (if ((poolType != CPMM))
1558+ then (poolType != FLAT)
1559+ else false)
1560+ then throw("Wrong pool type")
1561+ else {
1562+ let $t04915749251 = getPoolData(Address(fromBase58String(poolAddr)), type)
1563+ let aId = $t04915749251._1
1564+ let bId = $t04915749251._2
1565+ let aBal = $t04915749251._3
1566+ let bBal = $t04915749251._4
1567+ let shareId = $t04915749251._5
1568+ if ((0 > inFeeNoLoan))
1569+ then throw("inFeeNoLoan must be greater than 0")
1570+ else if ((0 > inFeeLoan))
1571+ then throw("inFeeLoan must be greater than 0")
1572+ else if ((0 > capFeeNoLoan))
1573+ then throw("capFeeNoLoan must be greater than 0")
1574+ else if ((0 > capFeeWithLoan))
1575+ then throw("capFeeWithLoan must be greater than 0")
1576+ else if ((0 > stoplossFeeNoLoan))
1577+ then throw("stoplossFeeNoLoan must be greater than 0")
1578+ else if ((0 > stoplossFeeWithLoan))
1579+ then throw("stoplossFeeWithLoan must be greater than 0")
1580+ else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
1581+ }))
15301582
15311583
15321584
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SF_POOL = "SF"
55
66 let WX_POOL = "WX"
7+
8+let CPMM = "cpmm"
9+
10+let FLAT = "flat"
711
812 let CAP_FEE_NO_LOAN = "capNoLoan"
913
1014 let CAP_FEE_LOAN = "capLoan"
1115
1216 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1317
1418 let STOPLOSS_LOAN = "stopLossLoan"
1519
1620 let LOAN_FEE = "loan"
1721
1822 let NO_LOAN_FEE = "noLoan"
1923
2024 let NO_FEE = "noFee"
2125
2226 let SCALE8 = 100000000
2327
2428 let SCALE10 = 10000000000
2529
2630 let SCALE16 = toBigInt(10000000000000000)
2731
2832 let FEE_SCALE6 = 1000000
2933
3034 let kSFPoolAAssetBalance = "A_asset_balance"
3135
3236 let kSFPoolBAssetBalance = "B_asset_balance"
3337
3438 let kSFPoolAAssetId = "A_asset_id"
3539
3640 let kSFPoolBAssetId = "B_asset_id"
3741
3842 let kSFPoolShareId = "share_asset_id"
3943
4044 let kSFPoolShareSupply = "share_asset_supply"
4145
4246 let kSFPoolFee = "commission"
4347
4448 let kUserPosition = "_userPosition"
4549
4650 let kUserPositionPool = "_userPositionPool"
4751
4852 let kUserBorrowAmount = "_userPositionBorrowAmount"
4953
5054 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5155
5256 let kUserPositionNum = "_userPositionNumber"
5357
5458 let kUserPositionInterest = "_userPositionInterest"
5559
5660 let kPoolTotal = "_poolTotal"
5761
5862 let kPoolTotalLoan = "_poolTotalLoan"
5963
6064 let kPoolInterestLoan = "_poolInterestLoan"
6165
6266 let kPoolInterestNoLoan = "_poolInterestNoLoan"
6367
6468 let kPoolCanBorrow = "_poolCanBorrow"
6569
6670 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
6771
6872 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
6973
7074 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7175
7276 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7377
7478 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7579
7680 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
7781
7882 let kRequestId = "_request_id"
7983
8084 let kRequestIter = "requests_iter"
8185
8286 let kPool = "pool_"
8387
8488 let kSharePool = "_poolShareId"
8589
8690 let kPoolCapChange = "_poolCapChange"
8791
8892 let kTokenLastPrice = "last_price"
8993
9094 let kPriceInOracle = "_twap5B"
9195
9296 let kActive = "active"
9397
9498 let kActiveUsers = "activeUsers"
9599
96100 let kActiveSFWX = "_active"
97101
98102 let kPoolActive = "_activePool"
99103
100104 let kUserStopLoss = "_stopLoss"
101105
106+let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
107+
102108 let kMoneyBox = "axly_money_box"
103109
104110 let kSFFarmingAddr = "swopfi_farming_addr"
105111
106112 let kLendService = "lend_service_addr"
107113
108114 let kOperatorCallPK = "admin_call_pub_key"
109115
110116 let kPriceOracle = "price_oracle"
111117
112118 let kExContract = "exchange_contract"
113119
114120 let kWxSwapContract = "wx_swap_contract"
115121
116122 let kSwopId = "swop_id"
117123
118124 let kWxId = "wx_id"
119125
120126 let kGroup1Admin1PK = "group1_admin1_pub_key"
121127
122128 let kGroup1Admin2PK = "group1_admin2_pub_key"
123129
124130 let kGroup2Admin1PK = "group2_admin1_pub_key"
125131
126132 let kGroup2Admin2PK = "group2_admin2_pub_key"
127133
128134 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
129135
130136 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
131137
132138 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
133139
134140 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
135141
136142 let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
137143
138144 let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
139145
140146 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
141147
142148 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
143149
144150 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
145151
146152 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
147153
148154 let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
149155
150156 func unknownPoolType () = throw("Wrong pool type")
151157
152158
153159 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
154160
155161
156-func isOperatorCall (i) = if ((i.callerPublicKey == i.callerPublicKey))
162+func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
157163 then unit
158164 else throw("Only operator can call this function")
159165
160166
161-func isAdminCall (i) = if (if ((i.callerPublicKey == i.callerPublicKey))
167+func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
162168 then true
163- else (i.callerPublicKey == i.callerPublicKey))
169+ else (i.callerPublicKey == group1Admin2PK))
164170 then unit
165171 else throw("Only admin group1 can call this function")
166172
167173
168174 func isSelfCall (i) = if ((i.caller == this))
169175 then unit
170176 else throw("Only contract itself can call this function")
171177
172178
173179 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
174180 then unit
175181 else throw("Only land contract can call this function")
176182
177183
178184 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
179185 then unit
180186 else throw("DApp is inactive at this moment")
181187
182188
183189 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
184190 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
185191 else false)
186192 then unit
187193 else throw("DApp is inactive for users at this moment")
188194
189195
190196 func isPoolActive (pool,type) = {
191197 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
192198 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
193199 if (if (WXSFActive)
194200 then poolActive
195201 else false)
196202 then true
197203 else false
198204 }
199205
200206
201207 func accountBalance (assetId) = match assetId {
202208 case id: ByteVector =>
203209 assetBalance(this, id)
204210 case waves: Unit =>
205211 wavesBalance(this).available
206212 case _ =>
207213 throw("Match error")
208214 }
209215
210216
211217 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"))
212218
213219
214220 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
215221 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
216222 if ($isInstanceOf(@, "Int"))
217223 then @
218224 else throw(($getType(@) + " couldn't be cast to Int"))
219225 }, {
220226 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
221227 if ($isInstanceOf(@, "Int"))
222228 then @
223229 else throw(($getType(@) + " couldn't be cast to Int"))
224230 })
225231
226232
227233 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
228234 then getSFPoolBalances(poolAddr)
229235 else if ((type == WX_POOL))
230236 then getWXPoolBalances(poolAddr, aId, bId)
231237 else unknownPoolType()
232238
233239
234240 func getSFPoolData (poolAddr) = {
235- let $t079127961 = getSFPoolBalances(poolAddr)
236- if (($t079127961 == $t079127961))
241+ let $t080238072 = getSFPoolBalances(poolAddr)
242+ if (($t080238072 == $t080238072))
237243 then {
238- let balB = $t079127961._2
239- let balA = $t079127961._1
244+ let balB = $t080238072._2
245+ let balA = $t080238072._1
240246 $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"))
241247 }
242248 else throw("Strict value is not equal to itself.")
243249 }
244250
245251
246252 func getWXPoolData (poolAddr) = {
247253 let cfg = {
248254 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
249255 if ($isInstanceOf(@, "List[Any]"))
250256 then @
251257 else throw(($getType(@) + " couldn't be cast to List[Any]"))
252258 }
253259 if ((cfg == cfg))
254260 then {
255261 let aId = valueOrErrorMessage({
256262 let @ = cfg[4]
257263 if ($isInstanceOf(@, "String"))
258264 then @
259265 else unit
260266 }, "Can't get pool A asset id")
261267 let bId = valueOrErrorMessage({
262268 let @ = cfg[5]
263269 if ($isInstanceOf(@, "String"))
264270 then @
265271 else unit
266272 }, "Can't get pool B asset id")
267273 let shareId = valueOrErrorMessage({
268274 let @ = cfg[3]
269275 if ($isInstanceOf(@, "String"))
270276 then @
271277 else unit
272278 }, "Can't get pool LP asset id")
273- let $t086588717 = getWXPoolBalances(poolAddr, aId, bId)
274- if (($t086588717 == $t086588717))
279+ let $t087698828 = getWXPoolBalances(poolAddr, aId, bId)
280+ if (($t087698828 == $t087698828))
275281 then {
276- let balB = $t086588717._2
277- let balA = $t086588717._1
282+ let balB = $t087698828._2
283+ let balA = $t087698828._1
278284 $Tuple5(aId, bId, balA, balB, shareId)
279285 }
280286 else throw("Strict value is not equal to itself.")
281287 }
282288 else throw("Strict value is not equal to itself.")
283289 }
284290
285291
286292 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
287293 then getSFPoolData(poolAddr)
288294 else if ((type == WX_POOL))
289295 then getWXPoolData(poolAddr)
290296 else unknownPoolType()
291297
292298
293299 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
294300 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
295301 else if ((type == WX_POOL))
296302 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
297303 else unknownPoolType()
298304
299305
300306 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
301307
302308
303309 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
304310
305311
306312 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
307313
308314
309315 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
310316 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
311317 else if ((feeType == CAP_FEE_NO_LOAN))
312318 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
313319 else if ((feeType == LOAN_FEE))
314320 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
315321 else if ((feeType == NO_LOAN_FEE))
316322 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
317323 else if ((feeType == NO_FEE))
318324 then 0
319325 else throw("Wrong fee type")
320326
321327
322328 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
323329
324330
325331 func getWXFarmingAddr (poolAddr) = {
326332 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
327333 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
328334 Address(fromBase58String(factroyCfg[1]))
329335 }
330336
331337
332338 func assetIdToStr (assetId) = match assetId {
333339 case id: ByteVector =>
334340 toBase58String(id)
335341 case waves: Unit =>
336342 "WAVES"
337343 case _ =>
338344 throw("Not Asset id")
339345 }
340346
341347
342348 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
343349 then unit
344350 else fromBase58String(assetId)
345351
346352
347353 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
348354 then 8
349355 else match assetInfo(fromBase58String(assetId)) {
350356 case asset: Asset =>
351357 asset.decimals
352358 case _ =>
353359 throw("Can't find asset")
354360 }
355361
356362
357363 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
358364
359365
360366 func getAssetsPrice (assetIds) = {
361367 func getPrices (a,assetId) = {
362368 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
363369 (a :+ assetPrice)
364370 }
365371
366372 let $l = assetIds
367373 let $s = size($l)
368374 let $acc0 = nil
369375 func $f0_1 ($a,$i) = if (($i >= $s))
370376 then $a
371377 else getPrices($a, $l[$i])
372378
373379 func $f0_2 ($a,$i) = if (($i >= $s))
374380 then $a
375381 else throw("List size exceeds 50")
376382
377383 $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)
378384 }
379385
380386
381387 func getSharePrice (shareId) = {
382388 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
383389 let poolAddr = Address(fromBase58String(pool))
384390 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
385- let $t01170611771 = getPoolData(poolAddr, pType)
386- let aId = $t01170611771._1
387- let bId = $t01170611771._2
388- let aBalance = $t01170611771._3
389- let bBalance = $t01170611771._4
391+ let $t01181711882 = getPoolData(poolAddr, pType)
392+ let aId = $t01181711882._1
393+ let bId = $t01181711882._2
394+ let aBalance = $t01181711882._3
395+ let bBalance = $t01181711882._4
390396 let prices = getAssetsPrice([aId, bId])
391397 let dPriceA = prices[0]
392398 let dPriceB = prices[1]
393399 if (if ((0 > dPriceA))
394400 then true
395401 else (0 > dPriceB))
396402 then -1
397403 else {
398404 let shareSupply = getShareSupply(poolAddr, pType, shareId)
399405 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
400406 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
401407 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
402408 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
403409 fraction(sum, sharePrecision, shareSupply)
404410 }
405411 }
406412
407413
408414 func getSharePrices (shareIds) = {
409415 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
410416
411417 let $l = shareIds
412418 let $s = size($l)
413419 let $acc0 = nil
414420 func $f0_1 ($a,$i) = if (($i >= $s))
415421 then $a
416422 else getPrices($a, $l[$i])
417423
418424 func $f0_2 ($a,$i) = if (($i >= $s))
419425 then $a
420426 else throw("List size exceeds 20")
421427
422428 $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)
423429 }
424430
425431
426432 func getCursEntries (aId,bId,shareId,wAmounts) = {
427433 let assetsPrices = getAssetsPrice([aId, bId])
428434 let sharePrice = getSharePrice(shareId)
429435 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
430436 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
431437 }
432438
433439
434440 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
435441 then {
436442 let repl = {
437443 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
438444 if ($isInstanceOf(@, "List[Any]"))
439445 then @
440446 else throw(($getType(@) + " couldn't be cast to List[Any]"))
441447 }
442448 if ((repl == repl))
443449 then $Tuple5({
444450 let @ = repl[3]
445451 if ($isInstanceOf(@, "Int"))
446452 then @
447453 else throw(($getType(@) + " couldn't be cast to Int"))
448454 }, {
449455 let @ = repl[4]
450456 if ($isInstanceOf(@, "Int"))
451457 then @
452458 else throw(($getType(@) + " couldn't be cast to Int"))
453459 }, {
454460 let @ = repl[1]
455461 if ($isInstanceOf(@, "Int"))
456462 then @
457463 else throw(($getType(@) + " couldn't be cast to Int"))
458464 }, assetIdToStr(repl[2]), {
459465 let @ = repl[0]
460466 if ($isInstanceOf(@, "Int"))
461467 then @
462468 else throw(($getType(@) + " couldn't be cast to Int"))
463469 })
464470 else throw("Strict value is not equal to itself.")
465471 }
466472 else if ((pType == WX_POOL))
467473 then {
468- let $t01331513565 = $Tuple2(split({
474+ let $t01342613676 = $Tuple2(split({
469475 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
470476 if ($isInstanceOf(@, "String"))
471477 then @
472478 else throw(($getType(@) + " couldn't be cast to String"))
473479 }, "__"), split({
474480 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
475481 if ($isInstanceOf(@, "String"))
476482 then @
477483 else throw(($getType(@) + " couldn't be cast to String"))
478484 }, "__"))
479- if (($t01331513565 == $t01331513565))
485+ if (($t01342613676 == $t01342613676))
480486 then {
481- let evalPutInB = $t01331513565._2
482- let evalPutInA = $t01331513565._1
487+ let evalPutInB = $t01342613676._2
488+ let evalPutInA = $t01342613676._1
483489 let lpInA = parseIntValue(evalPutInA[1])
484490 let lpInB = parseIntValue(evalPutInB[1])
485491 if ((lpInB > lpInA))
486492 then {
487493 let pmt = parseIntValue(evalPutInA[8])
488494 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
489495 }
490496 else {
491497 let pmt = parseIntValue(evalPutInB[7])
492498 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
493499 }
494500 }
495501 else throw("Strict value is not equal to itself.")
496502 }
497503 else unknownPoolType()
498504
499505
500506 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
501507 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
502508 if ((pType == SF_POOL))
503509 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
504510 else if ((pType == WX_POOL))
505511 then invoke(poolAddr, "put", [1000000, false], payments)
506512 else unknownPoolType()
507513 }
508514
509515
510516 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
511517 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
512518 if ((pType == SF_POOL))
513519 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
514520 else if ((pType == WX_POOL))
515521 then invoke(poolAddr, "putOneTkn", [0, false], payments)
516522 else unknownPoolType()
517523 }
518524
519525
520526 func stakeLP (pool,pType,shareId,amount) = {
521527 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
522528 if ((pType == SF_POOL))
523529 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
524530 else if ((pType == WX_POOL))
525531 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
526532 else unknownPoolType()
527533 }
528534
529535
530536 func unstakeLP (pool,pType,shareId,amount) = {
531- let $t01522415574 = if ((pType == SF_POOL))
537+ let $t01533515685 = if ((pType == SF_POOL))
532538 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
533539 else if ((pType == WX_POOL))
534540 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
535541 else unknownPoolType()
536- let farmAddr = $t01522415574._1
537- let fName = $t01522415574._2
538- let params = $t01522415574._3
542+ let farmAddr = $t01533515685._1
543+ let fName = $t01533515685._2
544+ let params = $t01533515685._3
539545 let inv = invoke(farmAddr, fName, params, nil)
540546 if ((inv == inv))
541547 then amount
542548 else throw("Strict value is not equal to itself.")
543549 }
544550
545551
546552 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
547553 let poolAddr = Address(fromBase58String(pool))
548554 let feeScale6 = 1000000
549555 let fee = getIntegerValue(poolAddr, kSFPoolFee)
550556 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
551- let $t01599616302 = if ((assetTokenToGet == assetIdA))
557+ let $t01610716413 = if ((assetTokenToGet == assetIdA))
552558 then {
553559 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
554560 $Tuple2(amountToPay, assetIdB)
555561 }
556562 else {
557563 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
558564 $Tuple2(amountToPay, assetIdA)
559565 }
560- let amountToPay = $t01599616302._1
561- let assetToPay = $t01599616302._2
566+ let amountToPay = $t01610716413._1
567+ let assetToPay = $t01610716413._2
562568 $Tuple2(assetToPay, amountToPay)
563569 }
564570
565571
566572 func getWXSwapFees (pool) = {
567573 let poolAddr = addressFromStringValue(pool)
568574 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
569575 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
570576 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
571577 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
572578 case fees: (Int, Int) =>
573579 $Tuple2(fees._1, fees._2)
574580 case _ =>
575581 $Tuple2(poolFeeDefault, protocolFeeDefault)
576582 }
577583 }
578584
579585
580586 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
581- let $t01704217081 = getWXSwapFees(pool)
582- let pFee = $t01704217081._1
583- let prFee = $t01704217081._2
587+ let $t01715317192 = getWXSwapFees(pool)
588+ let pFee = $t01715317192._1
589+ let prFee = $t01715317192._2
584590 let feeScale = toBigInt(100000000)
585- let $t01712117429 = if ((assetTokenToGet == assetIdA))
591+ let $t01723217540 = if ((assetTokenToGet == assetIdA))
586592 then {
587593 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
588594 $Tuple2(amountToPay, assetIdB)
589595 }
590596 else {
591597 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
592598 $Tuple2(amountToPay, assetIdA)
593599 }
594- let amountToPay = $t01712117429._1
595- let assetToPay = $t01712117429._2
600+ let amountToPay = $t01723217540._1
601+ let assetToPay = $t01723217540._2
596602 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
597603 $Tuple2(assetToPay, amountToPayWithFee)
598604 }
599605
600606
601-func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((pType == SF_POOL))
602- then {
603- let $t01777617898 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604- let assetToPay = $t01777617898._1
605- let amountToPay = $t01777617898._2
606- invoke(addressFromStringValue(pool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
607- }
608- else if ((pType == WX_POOL))
607+func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
608+ let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
609+ if (if ((pType == SF_POOL))
610+ then true
611+ else (poolFB != ""))
609612 then {
610- let $t01809818220 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
611- let assetToPay = $t01809818220._1
612- let amountToPay = $t01809818220._2
613- invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
613+ let $t01798118193 = if ((poolFB == ""))
614+ then $Tuple3(balA, balB, pool)
615+ else {
616+ let $t01808718160 = getSFPoolBalances(addressFromStringValue(poolFB))
617+ let sfBalA = $t01808718160._1
618+ let sfBalB = $t01808718160._2
619+ $Tuple3(sfBalA, sfBalB, poolFB)
620+ }
621+ let pBalA = $t01798118193._1
622+ let pBalB = $t01798118193._2
623+ let exPool = $t01798118193._3
624+ let $t01819818324 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
625+ let assetToPay = $t01819818324._1
626+ let amountToPay = $t01819818324._2
627+ invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
614628 }
615- else unknownPoolType()
629+ else if ((pType == WX_POOL))
630+ then {
631+ let $t01852618648 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
632+ let assetToPay = $t01852618648._1
633+ let amountToPay = $t01852618648._2
634+ invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
635+ }
636+ else unknownPoolType()
637+ }
616638
617639
618640 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
619- let $t01850718971 = if ((pType == SF_POOL))
641+ let $t01893519399 = if ((pType == SF_POOL))
620642 then {
621643 let inv = {
622644 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
623645 if ($isInstanceOf(@, "List[Any]"))
624646 then @
625647 else throw(($getType(@) + " couldn't be cast to List[Any]"))
626648 }
627649 if ((inv == inv))
628650 then $Tuple2({
629651 let @ = inv[0]
630652 if ($isInstanceOf(@, "Int"))
631653 then @
632654 else throw(($getType(@) + " couldn't be cast to Int"))
633655 }, {
634656 let @ = inv[1]
635657 if ($isInstanceOf(@, "Int"))
636658 then @
637659 else throw(($getType(@) + " couldn't be cast to Int"))
638660 })
639661 else throw("Strict value is not equal to itself.")
640662 }
641663 else if ((pType == WX_POOL))
642664 then {
643665 let inv = split({
644666 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
645667 if ($isInstanceOf(@, "String"))
646668 then @
647669 else throw(($getType(@) + " couldn't be cast to String"))
648670 }, "__")
649671 if ((inv == inv))
650672 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
651673 else throw("Strict value is not equal to itself.")
652674 }
653675 else unknownPoolType()
654- let amountA = $t01850718971._1
655- let amountB = $t01850718971._2
676+ let amountA = $t01893519399._1
677+ let amountB = $t01893519399._2
656678 $Tuple2(amountA, amountB)
657679 }
658680
659681
660682 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
661683 then {
662684 let balBefore = accountBalance(SWOPID)
663685 if ((balBefore == balBefore))
664686 then {
665687 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
666688 if ((inv == inv))
667689 then {
668690 let balAfter = accountBalance(SWOPID)
669691 $Tuple2((balAfter - balBefore), SWOPID)
670692 }
671693 else throw("Strict value is not equal to itself.")
672694 }
673695 else throw("Strict value is not equal to itself.")
674696 }
675697 else if ((pType == WX_POOL))
676698 then {
677- let $t01933919418 = getWXPoolData(addressFromStringValue(pool))
678- let aId = $t01933919418._1
679- let bId = $t01933919418._2
680- let aBal = $t01933919418._3
681- let bBal = $t01933919418._4
682- let lpId = $t01933919418._5
699+ let $t01976719846 = getWXPoolData(addressFromStringValue(pool))
700+ let aId = $t01976719846._1
701+ let bId = $t01976719846._2
702+ let aBal = $t01976719846._3
703+ let bBal = $t01976719846._4
704+ let lpId = $t01976719846._5
683705 let balBefore = accountBalance(WXID)
684706 if ((balBefore == balBefore))
685707 then {
686708 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
687709 if ((inv == inv))
688710 then {
689711 let balAfter = accountBalance(WXID)
690712 $Tuple2((balAfter - balBefore), WXID)
691713 }
692714 else throw("Strict value is not equal to itself.")
693715 }
694716 else throw("Strict value is not equal to itself.")
695717 }
696718 else unknownPoolType()
697719
698720
699721 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
700722 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
701723 if ((lpBalanceBefore == lpBalanceBefore))
702724 then {
703725 let poolAddr = addressFromStringValue(pool)
704- let $t02001620432 = if (if ((pmtA > 0))
726+ let $t02044420860 = if (if ((pmtA > 0))
705727 then (pmtB > 0)
706728 else false)
707729 then {
708- let $t02008220198 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
709- let pmtInA = $t02008220198._1
710- let pmtInB = $t02008220198._2
711- let change = $t02008220198._3
712- let changeId = $t02008220198._4
730+ let $t02051020626 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
731+ let pmtInA = $t02051020626._1
732+ let pmtInB = $t02051020626._2
733+ let change = $t02051020626._3
734+ let changeId = $t02051020626._4
713735 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
714736 if ((inv == inv))
715737 then $Tuple2(change, changeId)
716738 else throw("Strict value is not equal to itself.")
717739 }
718740 else if ((pmtA > 0))
719741 then $Tuple2(pmtA, aId)
720742 else if ((pmtB > 0))
721743 then $Tuple2(pmtB, bId)
722744 else throw("pmts must be > 0")
723- let change = $t02001620432._1
724- let changeId = $t02001620432._2
745+ let change = $t02044420860._1
746+ let changeId = $t02044420860._2
725747 let inv = if ((change > 0))
726748 then replenishOneTokenByType(poolAddr, pType, change, changeId)
727749 else nil
728750 if ((inv == inv))
729751 then {
730752 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
731753 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
732754 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
733755 let userShareForStake = (totalStaked - axlyFeeAmount)
734756 if ((0 >= userShareForStake))
735757 then throw("amount of staked sharetokens must be > 0")
736758 else {
737759 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
738760 if ((invLP == invLP))
739761 then $Tuple2(userShareForStake, axlyFeeAmount)
740762 else throw("Strict value is not equal to itself.")
741763 }
742764 }
743765 else throw("Strict value is not equal to itself.")
744766 }
745767 else throw("Strict value is not equal to itself.")
746768 }
747769
748770
749771 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
750772 let totalAmount = getPoolTotalShare(pool)
751773 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
752- let $t02128921527 = if (withLoan)
774+ let $t02171721955 = if (withLoan)
753775 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
754776 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
755- let curPoolInterest = $t02128921527._1
756- let totalStakedWithLoan = $t02128921527._2
777+ let curPoolInterest = $t02171721955._1
778+ let totalStakedWithLoan = $t02171721955._2
757779 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), 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))]
758780 }
759781
760782
761-func exchangeKeeper (toToken,pmtAmount,pmtAsset,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
762- let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
783+func listToInt (a,item) = (a :+ parseIntValue(item))
784+
785+
786+func directSwopfiCPMM (rArgs,tokenTo) = {
787+ let dApp = addressFromStringValue(rArgs[1])
788+ let pmtP = split(rArgs[2], "|")
789+ let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
763790 if ((tokenBalanceBefore == tokenBalanceBefore))
764791 then {
765- let inv = invoke(exContract, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [AttachedPayment(pmtAsset, pmtAmount)])
792+ let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
793+ let minToRecive = rArgs[3]
794+ let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
766795 if ((inv == inv))
767- then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
796+ then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
768797 else throw("Strict value is not equal to itself.")
769798 }
770799 else throw("Strict value is not equal to itself.")
771800 }
772801
773802
774-func exchangePuzzle (toToken,pmtAmount,pmtAsset,routesStr,minToReceive,options) = {
775- let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
803+func directRoutingSwopfi (rArgs,tokenTo) = {
804+ let dApp = addressFromStringValue(rArgs[1])
805+ let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
776806 if ((tokenBalanceBefore == tokenBalanceBefore))
777807 then {
778- let inv = invoke(exContract, "puzzleSwap", [routesStr, minToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
808+ let pmt = {
809+ let pmtP = split(rArgs[2], "|")
810+[AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
811+ }
812+ let args = {
813+ let eArgs = split(rArgs[3], "|")
814+ let exchangers = split(eArgs[0], ",")
815+ let exchangersType = split(eArgs[1], ",")
816+ let args1 = {
817+ let $l = split(eArgs[2], ",")
818+ let $s = size($l)
819+ let $acc0 = nil
820+ func $f0_1 ($a,$i) = if (($i >= $s))
821+ then $a
822+ else listToInt($a, $l[$i])
823+
824+ func $f0_2 ($a,$i) = if (($i >= $s))
825+ then $a
826+ else throw("List size exceeds 3")
827+
828+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
829+ }
830+ let args2 = {
831+ let $l = split(eArgs[3], ",")
832+ let $s = size($l)
833+ let $acc0 = nil
834+ func $f1_1 ($a,$i) = if (($i >= $s))
835+ then $a
836+ else listToInt($a, $l[$i])
837+
838+ func $f1_2 ($a,$i) = if (($i >= $s))
839+ then $a
840+ else throw("List size exceeds 3")
841+
842+ $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
843+ }
844+ let routingAssetsKeys = split(eArgs[4], ",")
845+ let minToRecive = parseIntValue(eArgs[5])
846+[exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
847+ }
848+ let inv = invoke(dApp, "routingTrade", args, pmt)
779849 if ((inv == inv))
780- then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
781- else throw("Strict value is not equal to itself.")
782- }
783- else throw("Strict value is not equal to itself.")
784- }
785-
786-
787-func exchangeSwopFi (toToken,pmtAmount,pmtAsset,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
788- let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
789- if ((tokenBalanceBefore == tokenBalanceBefore))
790- then {
791- let inv = invoke(exContract, "swopfiSwap", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
792- if ((inv == inv))
793- then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
850+ then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
794851 else throw("Strict value is not equal to itself.")
795852 }
796853 else throw("Strict value is not equal to itself.")
797854 }
798855
799856
800857 func capitalize (pool,pType,tokenId,tokenAmount) = {
801858 let poolAddr = Address(fromBase58String(pool))
802- let $t02388123947 = getPoolData(poolAddr, pType)
803- let AId = $t02388123947._1
804- let BId = $t02388123947._2
805- let balA = $t02388123947._3
806- let balB = $t02388123947._4
807- let shareId = $t02388123947._5
859+ let $t02406224128 = getPoolData(poolAddr, pType)
860+ let AId = $t02406224128._1
861+ let BId = $t02406224128._2
862+ let balA = $t02406224128._3
863+ let balB = $t02406224128._4
864+ let shareId = $t02406224128._5
808865 if (if ((tokenId != AId))
809866 then (tokenId != BId)
810867 else false)
811868 then throw("Wrong asset")
812869 else {
813870 let totalShareAmount = getPoolTotalShare(pool)
814- let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
815- let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
816- let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
817- let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
818- let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
819- let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
820- let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
821- let $t02458724687 = if ((tokenId == AId))
822- then $Tuple2((tokenAmount - axlyFee), 0)
823- else $Tuple2(0, (tokenAmount - axlyFee))
824- let pmtA = $t02458724687._1
825- let pmtB = $t02458724687._2
826- let $t02469024794 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
827- let stakedAmount = $t02469024794._1
828- let nf = $t02469024794._2
829- let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
830- let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
831- let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
832- let stakedNoLoan = (stakedAmount - stakedLoan)
833- let newInterestLoan = if ((totalShareAmountWithLoan > 0))
834- then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
835- else 0
836- let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
837- then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
838- else 0
839- ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, fromBase58String(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
871+ if ((totalShareAmount == 0))
872+ then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
873+ else {
874+ let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
875+ let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
876+ let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
877+ let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
878+ let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
879+ let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
880+ let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
881+ let $t02487324973 = if ((tokenId == AId))
882+ then $Tuple2((tokenAmount - axlyFee), 0)
883+ else $Tuple2(0, (tokenAmount - axlyFee))
884+ let pmtA = $t02487324973._1
885+ let pmtB = $t02487324973._2
886+ let $t02497625080 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
887+ let stakedAmount = $t02497625080._1
888+ let nf = $t02497625080._2
889+ let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
890+ let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
891+ let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
892+ let stakedNoLoan = (stakedAmount - stakedLoan)
893+ let newInterestLoan = if ((totalShareAmountWithLoan > 0))
894+ then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
895+ else 0
896+ let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
897+ then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
898+ else 0
899+ ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
900+ }
840901 }
841902 }
842903
843904
844905 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
845906 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
846907 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
847908 let poolInterest = if (borrowed)
848909 then getIntegerValue(this, (pool + kPoolInterestLoan))
849910 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
850911 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
851912 }
852913
853914
854915 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
855916 let feeType = if (isBorrowed)
856917 then STOPLOSS_LOAN
857918 else STOPLOSS_FEE_NO_LOAN
858919 if (stopLoss)
859920 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
860921 else 0
861922 }
862923
863924
864925 func withdrawToUser (user,pool,posId,stopLoss) = {
865926 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
866927 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
867928 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
868929 let poolTotalShare = getPoolTotalShare(pool)
869930 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
870931 let userAddr = Address(fromBase58String(user))
871932 let poolAddr = Address(fromBase58String(pool))
872933 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
873- let $t02732527397 = getPoolData(poolAddr, pType)
874- let idAStr = $t02732527397._1
875- let idBStr = $t02732527397._2
876- let balA = $t02732527397._3
877- let balB = $t02732527397._4
878- let shareId = $t02732527397._5
879- let $t02740027467 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
880- let idA = $t02740027467._1
881- let idB = $t02740027467._2
934+ let $t02760927681 = getPoolData(poolAddr, pType)
935+ let idAStr = $t02760927681._1
936+ let idBStr = $t02760927681._2
937+ let balA = $t02760927681._3
938+ let balB = $t02760927681._4
939+ let shareId = $t02760927681._5
940+ let $t02768427751 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
941+ let idA = $t02768427751._1
942+ let idB = $t02768427751._2
882943 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
883944 let cBalABefore = accountBalance(idA)
884945 if ((cBalABefore == cBalABefore))
885946 then {
886947 let cBalBBefore = accountBalance(idB)
887948 if ((cBalBBefore == cBalBBefore))
888949 then {
889950 let inv = if ((pType == SF_POOL))
890951 then {
891952 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
892953 if ((inv == inv))
893954 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
894955 else throw("Strict value is not equal to itself.")
895956 }
896957 else if ((pType == WX_POOL))
897958 then {
898959 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
899960 if ((inv == inv))
900961 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
901962 else throw("Strict value is not equal to itself.")
902963 }
903964 else unknownPoolType()
904965 if ((inv == inv))
905966 then {
906967 let cBalAAfter = accountBalance(idA)
907968 if ((cBalAAfter == cBalAAfter))
908969 then {
909970 let cBalBAfter = accountBalance(idB)
910971 if ((cBalBAfter == cBalBAfter))
911972 then {
912- let $t02816228251 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
913- let tokensAmountA = $t02816228251._1
914- let tokensAmountB = $t02816228251._2
915- let $t02825429490 = if (isBorrowed)
973+ let $t02844628535 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
974+ let tokensAmountA = $t02844628535._1
975+ let tokensAmountB = $t02844628535._2
976+ let $t02853829774 = if (isBorrowed)
916977 then {
917978 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
918979 let debt = {
919980 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
920981 if ($isInstanceOf(@, "Int"))
921982 then @
922983 else throw(($getType(@) + " couldn't be cast to Int"))
923984 }
924985 if ((debt == debt))
925986 then {
926987 let amountToGetEx = if (if ((borrowAsset == idAStr))
927988 then (debt > tokensAmountA)
928989 else false)
929990 then (debt - tokensAmountA)
930991 else if (if ((borrowAsset == idBStr))
931992 then (debt > tokensAmountB)
932993 else false)
933994 then (debt - tokensAmountB)
934995 else 0
935996 let exInv = if ((amountToGetEx > 0))
936997 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
937998 else nil
938999 if ((exInv == exInv))
9391000 then {
9401001 let cBalAAfterRepay = accountBalance(idA)
9411002 if ((cBalAAfterRepay == cBalAAfterRepay))
9421003 then {
9431004 let cBalBAfterRepay = accountBalance(idB)
9441005 if ((cBalBAfterRepay == cBalBAfterRepay))
9451006 then {
9461007 let closeDbtInv = if ((debt > 0))
9471008 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
9481009 else 0
9491010 if ((closeDbtInv == closeDbtInv))
9501011 then if ((borrowAsset == idAStr))
9511012 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
9521013 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
9531014 else throw("Strict value is not equal to itself.")
9541015 }
9551016 else throw("Strict value is not equal to itself.")
9561017 }
9571018 else throw("Strict value is not equal to itself.")
9581019 }
9591020 else throw("Strict value is not equal to itself.")
9601021 }
9611022 else throw("Strict value is not equal to itself.")
9621023 }
9631024 else $Tuple2(tokensAmountA, tokensAmountB)
964- let toUserA = $t02825429490._1
965- let toUserB = $t02825429490._2
1025+ let toUserA = $t02853829774._1
1026+ let toUserB = $t02853829774._2
9661027 let poolTotalLoanEntries = if (isBorrowed)
9671028 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
9681029 else nil
9691030 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)), IntegerEntry((pool + kPoolTotal), ((poolTotalShare - userCanWithdraw) - stopLossFee)), ScriptTransfer(userAddr, toUserA, idA), ScriptTransfer(userAddr, toUserB, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
9701031 $Tuple2(entries, [toUserA, toUserB])
9711032 }
9721033 else throw("Strict value is not equal to itself.")
9731034 }
9741035 else throw("Strict value is not equal to itself.")
9751036 }
9761037 else throw("Strict value is not equal to itself.")
9771038 }
9781039 else throw("Strict value is not equal to itself.")
9791040 }
9801041 else throw("Strict value is not equal to itself.")
9811042 }
9821043
9831044
9841045 func parseRequest (requestId) = {
9851046 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
9861047 let user = request[0]
9871048 let pool = request[1]
9881049 let pmtA = parseIntValue(request[2])
9891050 let AId = request[3]
9901051 let pmtB = parseIntValue(request[4])
9911052 let BId = request[5]
9921053 let balA = parseIntValue(request[6])
9931054 let balB = parseIntValue(request[7])
9941055 let shareId = request[8]
9951056 let bwAsset = request[9]
9961057 let bwAmount = parseIntValue(request[10])
9971058 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
9981059 }
9991060
10001061
10011062 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
10021063 then (borrowId != bId)
10031064 else false)
10041065 then throw("Wrong borrow asset")
10051066 else {
10061067 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
10071068 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
10081069 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10091070 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10101071 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1011- let $t03147231569 = if ((borrowId == aId))
1072+ let $t03175631853 = if ((borrowId == aId))
10121073 then $Tuple2(dPriceA, decPrA)
10131074 else $Tuple2(dPriceB, decPrB)
1014- let borrowPrice = $t03147231569._1
1015- let borrowDecPr = $t03147231569._2
1075+ let borrowPrice = $t03175631853._1
1076+ let borrowDecPr = $t03175631853._2
10161077 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10171078 }
10181079
10191080
10201081 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
10211082 then if ((assetIdToStr(pmts[0].assetId) != AId))
10221083 then throw("Wrong payment asset A")
10231084 else if ((assetIdToStr(pmts[1].assetId) != BId))
10241085 then throw("Wrong payment asset B")
10251086 else $Tuple2(pmts[0].amount, pmts[1].amount)
10261087 else if ((size(pmts) == 1))
10271088 then if ((assetIdToStr(pmts[0].assetId) == AId))
10281089 then $Tuple2(pmts[0].amount, 0)
10291090 else if ((assetIdToStr(pmts[0].assetId) == BId))
10301091 then $Tuple2(0, pmts[0].amount)
10311092 else throw("Wrong payment")
10321093 else throw("One or two payments expected")
10331094
10341095
10351096 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
10361097 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
10371098 if ((0 > pri))
10381099 then (pri * -1)
10391100 else pri
10401101 }
10411102
10421103
10431104 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1044- let $t03256932828 = if (claim)
1105+ let $t03285333115 = if (claim)
10451106 then claimFarmed(pType, pool)
10461107 else {
10471108 let claimedAsset = if ((pType == SF_POOL))
10481109 then SWOPID
10491110 else if ((pType == WX_POOL))
10501111 then WXID
10511112 else unknownPoolType()
10521113 $Tuple2(amount, claimedAsset)
10531114 }
1054- let claimAmount = $t03256932828._1
1055- let claimAsset = $t03256932828._2
1056- let bal = accountBalance(claimAsset)
1057- if (if ((amount > (claimAmount + change)))
1058- then true
1059- else (amount > bal))
1060- then throw("To big amount to exchange")
1061- else $Tuple2(claimAmount, claimAsset)
1115+ if (($t03285333115 == $t03285333115))
1116+ then {
1117+ let claimAsset = $t03285333115._2
1118+ let claimAmount = $t03285333115._1
1119+ let bal = accountBalance(claimAsset)
1120+ if ((bal == bal))
1121+ then if ((amount > bal))
1122+ then throw("To big amount to exchange")
1123+ else $Tuple2(claimAmount, claimAsset)
1124+ else throw("Strict value is not equal to itself.")
1125+ }
1126+ else throw("Strict value is not equal to itself.")
10621127 }
10631128
10641129
10651130 @Callable(i)
10661131 func getPoolInfoREADONLY (pool) = {
10671132 let poolAddr = addressFromStringValue(pool)
10681133 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1069- let $t03322533315 = getPoolData(Address(fromBase58String(pool)), pType)
1070- let AId = $t03322533315._1
1071- let BId = $t03322533315._2
1072- let balA = $t03322533315._3
1073- let balB = $t03322533315._4
1074- let shareId = $t03322533315._5
1134+ let $t03348233572 = getPoolData(Address(fromBase58String(pool)), pType)
1135+ let AId = $t03348233572._1
1136+ let BId = $t03348233572._2
1137+ let balA = $t03348233572._3
1138+ let balB = $t03348233572._4
1139+ let shareId = $t03348233572._5
10751140 let shareSupply = getShareSupply(poolAddr, pType, shareId)
10761141 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
10771142 }
10781143
10791144
10801145
10811146 @Callable(i)
10821147 func getShareAssetPriceREADONLY (shareId) = {
10831148 let sharePrices = getSharePrice(shareId)
10841149 $Tuple2(nil, sharePrices)
10851150 }
10861151
10871152
10881153
10891154 @Callable(i)
10901155 func getUserPositionShareAmountREADONLY (user,posNum) = {
10911156 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
10921157 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
10931158 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
10941159 $Tuple2(nil, userCanWithdraw)
10951160 }
10961161
10971162
10981163
10991164 @Callable(i)
11001165 func getUserPositionREADONLY (user,pools,posNum) = {
11011166 func userPos (a,pool) = {
1102- let $t03418834258 = a
1103- let wAmountsA = $t03418834258._1
1104- let wAmountsB = $t03418834258._2
1105- let debts = $t03418834258._3
1106- let eqWAmountsA = $t03418834258._4
1107- let eqWAmountsB = $t03418834258._5
1108- let index = $t03418834258._6
1167+ let $t03444534515 = a
1168+ let wAmountsA = $t03444534515._1
1169+ let wAmountsB = $t03444534515._2
1170+ let debts = $t03444534515._3
1171+ let eqWAmountsA = $t03444534515._4
1172+ let eqWAmountsB = $t03444534515._5
1173+ let index = $t03444534515._6
11091174 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11101175 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11111176 else {
11121177 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1113- let $t03453734627 = getPoolData(Address(fromBase58String(pool)), pType)
1114- let AId = $t03453734627._1
1115- let BId = $t03453734627._2
1116- let balA = $t03453734627._3
1117- let balB = $t03453734627._4
1118- let shareId = $t03453734627._5
1178+ let $t03479434884 = getPoolData(Address(fromBase58String(pool)), pType)
1179+ let AId = $t03479434884._1
1180+ let BId = $t03479434884._2
1181+ let balA = $t03479434884._3
1182+ let balB = $t03479434884._4
1183+ let shareId = $t03479434884._5
11191184 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11201185 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1121- let $t03484334963 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1122- let wAmountA = $t03484334963._1
1123- let wAmountB = $t03484334963._2
1186+ let $t03510035220 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1187+ let wAmountA = $t03510035220._1
1188+ let wAmountB = $t03510035220._2
11241189 if ((borrowAmount > 0))
11251190 then {
11261191 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11271192 let debt = {
11281193 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
11291194 if ($isInstanceOf(@, "Int"))
11301195 then @
11311196 else throw(($getType(@) + " couldn't be cast to Int"))
11321197 }
11331198 if ((debt == debt))
11341199 then {
11351200 let amountToGetEx = if (if ((borrowAsset == AId))
11361201 then (debt > wAmountA)
11371202 else false)
11381203 then (debt - wAmountA)
11391204 else if (if ((borrowAsset == BId))
11401205 then (debt > wAmountB)
11411206 else false)
11421207 then (debt - wAmountB)
11431208 else 0
11441209 let amountToPay = if ((amountToGetEx > 0))
11451210 then if ((pType == SF_POOL))
11461211 then {
11471212 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
11481213 ex._2
11491214 }
11501215 else if ((pType == WX_POOL))
11511216 then {
11521217 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
11531218 ex._2
11541219 }
11551220 else unknownPoolType()
11561221 else 0
1157- let $t03587536094 = if ((borrowAsset == AId))
1222+ let $t03613236351 = if ((borrowAsset == AId))
11581223 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
11591224 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1160- let eqWAmountA = $t03587536094._1
1161- let eqWAmountB = $t03587536094._2
1225+ let eqWAmountA = $t03613236351._1
1226+ let eqWAmountB = $t03613236351._2
11621227 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
11631228 }
11641229 else throw("Strict value is not equal to itself.")
11651230 }
11661231 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
11671232 }
11681233 }
11691234
1170- let $t03634936460 = {
1235+ let $t03660636717 = {
11711236 let $l = pools
11721237 let $s = size($l)
11731238 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
11741239 func $f0_1 ($a,$i) = if (($i >= $s))
11751240 then $a
11761241 else userPos($a, $l[$i])
11771242
11781243 func $f0_2 ($a,$i) = if (($i >= $s))
11791244 then $a
11801245 else throw("List size exceeds 20")
11811246
11821247 $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)
11831248 }
1184- let wAmountsA = $t03634936460._1
1185- let wAmountsB = $t03634936460._2
1186- let debts = $t03634936460._3
1187- let eqWAmountsA = $t03634936460._4
1188- let eqWAmountsB = $t03634936460._5
1249+ let wAmountsA = $t03660636717._1
1250+ let wAmountsB = $t03660636717._2
1251+ let debts = $t03660636717._3
1252+ let eqWAmountsA = $t03660636717._4
1253+ let eqWAmountsB = $t03660636717._5
11891254 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
11901255 }
11911256
11921257
11931258
11941259 @Callable(i)
11951260 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
11961261 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
11971262 if (!(isPoolActive(pool, pType)))
11981263 then throw("Pool not active at this moment")
11991264 else if (if ((100 > leverage))
12001265 then true
12011266 else (leverage > 300))
12021267 then throw("Leverage can't be <100 and >300")
12031268 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
12041269 then (leverage > 100)
12051270 else false)
12061271 then throw("You can't borrow in this pool")
12071272 else {
1208- let $t03705837148 = getPoolData(Address(fromBase58String(pool)), pType)
1209- let AId = $t03705837148._1
1210- let BId = $t03705837148._2
1211- let balA = $t03705837148._3
1212- let balB = $t03705837148._4
1213- let shareId = $t03705837148._5
1273+ let $t03731537405 = getPoolData(Address(fromBase58String(pool)), pType)
1274+ let AId = $t03731537405._1
1275+ let BId = $t03731537405._2
1276+ let balA = $t03731537405._3
1277+ let balB = $t03731537405._4
1278+ let shareId = $t03731537405._5
12141279 if (if ((borrowId != AId))
12151280 then (borrowId != BId)
12161281 else false)
12171282 then throw("Wrong borrow asset")
12181283 else {
1219- let $t03722937288 = parseReplenishPmts(i.payments, AId, BId)
1220- let pmtA = $t03722937288._1
1221- let pmtB = $t03722937288._2
1284+ let $t03748637545 = parseReplenishPmts(i.payments, AId, BId)
1285+ let pmtA = $t03748637545._1
1286+ let pmtB = $t03748637545._2
12221287 let user = toString(i.caller)
12231288 let newPosNum = getNewUserPositionNumber(user)
12241289 if ((leverage > 100))
12251290 then {
12261291 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
12271292 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
12281293 let newRequestId = {
12291294 let @ = invoke(this, "createNewRequest", [request], nil)
12301295 if ($isInstanceOf(@, "Int"))
12311296 then @
12321297 else throw(($getType(@) + " couldn't be cast to Int"))
12331298 }
12341299 if ((newRequestId == newRequestId))
12351300 then {
12361301 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
12371302 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
12381303 if ((inv == inv))
12391304 then {
12401305 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1241- let $t03827738371 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1242- if (($t03827738371 == $t03827738371))
1306+ let $t03853438628 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1307+ if (($t03853438628 == $t03853438628))
12431308 then {
1244- let newBalB = $t03827738371._2
1245- let newBalA = $t03827738371._1
1309+ let newBalB = $t03853438628._2
1310+ let newBalA = $t03853438628._1
12461311 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1247- let $t03844138556 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1248- let wAmountA = $t03844138556._1
1249- let wAmountB = $t03844138556._2
1312+ let $t03869838813 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1313+ let wAmountA = $t03869838813._1
1314+ let wAmountB = $t03869838813._2
12501315 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
12511316 }
12521317 else throw("Strict value is not equal to itself.")
12531318 }
12541319 else throw("Strict value is not equal to itself.")
12551320 }
12561321 else throw("Strict value is not equal to itself.")
12571322 }
12581323 else {
1259- let $t03860938724 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1260- if (($t03860938724 == $t03860938724))
1324+ let $t03886638981 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1325+ if (($t03886638981 == $t03886638981))
12611326 then {
1262- let axlyFee = $t03860938724._2
1263- let userStaked = $t03860938724._1
1264- let $t03873038824 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1265- if (($t03873038824 == $t03873038824))
1327+ let axlyFee = $t03886638981._2
1328+ let userStaked = $t03886638981._1
1329+ let $t03898739081 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1330+ if (($t03898739081 == $t03898739081))
12661331 then {
1267- let newBalB = $t03873038824._2
1268- let newBalA = $t03873038824._1
1332+ let newBalB = $t03898739081._2
1333+ let newBalA = $t03898739081._1
12691334 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1270- let $t03889439009 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1271- let wAmountA = $t03889439009._1
1272- let wAmountB = $t03889439009._2
1335+ let $t03915139266 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1336+ let wAmountA = $t03915139266._1
1337+ let wAmountB = $t03915139266._2
12731338 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
12741339 }
12751340 else throw("Strict value is not equal to itself.")
12761341 }
12771342 else throw("Strict value is not equal to itself.")
12781343 }
12791344 }
12801345 }
12811346 })
12821347
12831348
12841349
12851350 @Callable(i)
12861351 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
12871352 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
12881353 if (!(isPoolActive(pool, pType)))
12891354 then throw("Pool not active at this moment")
12901355 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
12911356 })
12921357
12931358
12941359
12951360 @Callable(i)
12961361 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
12971362 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
12981363 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
12991364 if (!(isPoolActive(poolId, pType)))
13001365 then throw("Pool not active at this moment")
13011366 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
13021367 then throw("There are no user position")
13031368 else if ((0 >= price))
13041369 then throw("Price must be greater than 0")
13051370 else if ((price > tokenOraclePrice))
13061371 then throw("Price must be less than current token price")
13071372 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
13081373 })
13091374
13101375
13111376
13121377 @Callable(i)
13131378 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
13141379 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13151380 if (!(isPoolActive(poolId, pType)))
13161381 then throw("Pool not active at this moment")
13171382 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
13181383 then throw("No entry")
13191384 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
13201385 })
13211386
13221387
13231388
13241389 @Callable(i)
13251390 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
13261391 then throw("Already inited")
13271392 else if (!(isDefined(addressFromString(moneyBoxAddr))))
13281393 then throw("moneyBoxAddr is not correct address")
13291394 else if (!(isDefined(addressFromString(sfFarmingAddr))))
13301395 then throw("sfFarmingAddr is not correct address")
13311396 else if (!(isDefined(addressFromString(lendAddr))))
13321397 then throw("lendAddr is not correct address")
13331398 else if (!(isDefined(addressFromString(priceOracleAddr))))
13341399 then throw("priceOracleAddr is not correct address")
13351400 else if (!(isDefined(addressFromString(keeperExContract))))
13361401 then throw("keeperExContract is not correct address")
13371402 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
13381403 then throw("swopAssetId is not correct asset id")
13391404 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
13401405 then throw("swopAssetId is not correct asset id")
13411406 else if ((size(fromBase58String(operatorPubKey)) != 32))
13421407 then throw("operatorPubKey is not correct")
13431408 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
13441409 then throw("group1Admin1PubKey is not correct")
13451410 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
13461411 then throw("group1Admin2PubKey is not correct")
13471412 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
13481413 then throw("group2Admin1PubKey is not correct")
13491414 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
13501415 then throw("group2Admin2PubKey is not correct")
13511416 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)])
13521417
13531418
13541419
13551420 @Callable(i)
13561421 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
13571422 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
13581423 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
13591424 })
13601425
13611426
13621427
13631428 @Callable(i)
13641429 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1365- let $t04384843952 = parseRequest(requestId)
1366- let user = $t04384843952._1
1367- let pool = $t04384843952._2
1368- let pmtA = $t04384843952._3
1369- let AId = $t04384843952._4
1370- let pmtB = $t04384843952._5
1371- let BId = $t04384843952._6
1372- let balA = $t04384843952._7
1373- let balB = $t04384843952._8
1374- let shareId = $t04384843952._9
1375- let bwAsset = $t04384843952._10
1376- let bwAmount = $t04384843952._11
1430+ let $t04410544209 = parseRequest(requestId)
1431+ let user = $t04410544209._1
1432+ let pool = $t04410544209._2
1433+ let pmtA = $t04410544209._3
1434+ let AId = $t04410544209._4
1435+ let pmtB = $t04410544209._5
1436+ let BId = $t04410544209._6
1437+ let balA = $t04410544209._7
1438+ let balB = $t04410544209._8
1439+ let shareId = $t04410544209._9
1440+ let bwAsset = $t04410544209._10
1441+ let bwAmount = $t04410544209._11
13771442 if ((size(i.payments) != 1))
13781443 then throw("Wrong payment size")
13791444 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
13801445 then true
13811446 else (i.payments[0].amount != bwAmount))
13821447 then throw("Wrong payment")
13831448 else {
1384- let $t04414244242 = if ((AId == bwAsset))
1449+ let $t04439944499 = if ((AId == bwAsset))
13851450 then $Tuple2((pmtA + bwAmount), pmtB)
13861451 else $Tuple2(pmtA, (pmtB + bwAmount))
1387- let pmtAllA = $t04414244242._1
1388- let pmtAllB = $t04414244242._2
1452+ let pmtAllA = $t04439944499._1
1453+ let pmtAllB = $t04439944499._2
13891454 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1390- let $t04432444439 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1391- let userStaked = $t04432444439._1
1392- let axlyFee = $t04432444439._2
1455+ let $t04458144696 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1456+ let userStaked = $t04458144696._1
1457+ let axlyFee = $t04458144696._2
13931458 let posNum = getNewUserPositionNumber(user)
13941459 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
13951460 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1396- let $t04479944914 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1397- let wAmountA = $t04479944914._1
1398- let wAmountB = $t04479944914._2
1461+ let $t04505645171 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1462+ let wAmountA = $t04505645171._1
1463+ let wAmountB = $t04505645171._2
13991464 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14001465 }
14011466 }))
14021467
14031468
14041469
14051470 @Callable(i)
14061471 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14071472 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14081473 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1409- let $t04543545525 = getPoolData(Address(fromBase58String(pool)), pType)
1410- let AId = $t04543545525._1
1411- let BId = $t04543545525._2
1412- let balA = $t04543545525._3
1413- let balB = $t04543545525._4
1414- let shareId = $t04543545525._5
1474+ let $t04569245782 = getPoolData(Address(fromBase58String(pool)), pType)
1475+ let AId = $t04569245782._1
1476+ let BId = $t04569245782._2
1477+ let balA = $t04569245782._3
1478+ let balB = $t04569245782._4
1479+ let shareId = $t04569245782._5
14151480 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14161481 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14171482 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
14181483 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
14191484 if ((liquidateAmount > userCanWithdraw))
14201485 then throw("You can't liquidate more than user have")
14211486 else if ((borrowAmount == 0))
14221487 then throw("You can't liquidate position without borrow")
14231488 else [IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), getIntegerValue(this, (pool + kPoolInterestLoan))), IntegerEntry((pool + kPoolTotalLoan), (getPoolTotalShareWithLoan(pool) - liquidateAmount)), IntegerEntry((pool + kPoolTotal), (getPoolTotalShare(pool) - liquidateAmount)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (userCanWithdraw - liquidateAmount)), ScriptTransfer(i.caller, amount, fromBase58String(shareId))]
14241489 }))
14251490
14261491
14271492
14281493 @Callable(i)
14291494 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14301495 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14311496 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
14321497 if ((tokenOraclePrice > stopLossPrice))
14331498 then throw("Token price greater stop loss price")
14341499 else {
14351500 let res = withdrawToUser(user, pool, toString(posId), true)
14361501 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
14371502 }
14381503 }))
14391504
14401505
14411506
14421507 @Callable(i)
1443-func capitalizeExKeeper (pool,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
1508+func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14441509 let pType = getStringValue(this, (kPool + pool))
14451510 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1446- let $t04767447773 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1447- let claimedAmount = $t04767447773._1
1448- let claimedAsset = $t04767447773._2
1449- let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
1450- let newChange = ((claimedAmount + change) - amountToExchange)
1451- let changeEntry = if ((newChange >= 0))
1452- then [IntegerEntry((pool + kPoolCapChange), newChange)]
1453- else throw("Negative change")
1454- (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
1455- }))
1456-
1457-
1458-
1459-@Callable(i)
1460-func capitalizeExPuzzle (pool,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
1461- let pType = getStringValue(this, (kPool + pool))
1462- let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1463- let $t04857348672 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1464- let claimedAmount = $t04857348672._1
1465- let claimedAsset = $t04857348672._2
1466- let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
1467- let newChange = ((claimedAmount + change) - amountToExchange)
1468- let changeEntry = if ((newChange >= 0))
1469- then [IntegerEntry((pool + kPoolCapChange), newChange)]
1470- else nil
1471- (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
1472- }))
1473-
1474-
1475-
1476-@Callable(i)
1477-func capitalizeExSwopFi (pool,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
1478- let pType = getStringValue(this, (kPool + pool))
1479- let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1480- let $t04951749616 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1481- let claimedAmount = $t04951749616._1
1482- let claimedAsset = $t04951749616._2
1483- let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
1484- let newChange = ((claimedAmount + change) - amountToExchange)
1485- let changeEntry = if ((newChange >= 0))
1486- then [IntegerEntry((pool + kPoolCapChange), newChange)]
1487- else nil
1488- (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
1511+ let $t04775247854 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1512+ if (($t04775247854 == $t04775247854))
1513+ then {
1514+ let claimedAsset = $t04775247854._2
1515+ let claimedAmount = $t04775247854._1
1516+ let rArgs = split(route, "__")
1517+ let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
1518+ then directSwopfiCPMM(rArgs, tokenToId)
1519+ else if ((rArgs[0] == "routingSwopfi"))
1520+ then directRoutingSwopfi(rArgs, tokenToId)
1521+ else throw("Wrong route")
1522+ if ((exchangedAmount == exchangedAmount))
1523+ then {
1524+ let newChange = ((claimedAmount + change) - amountToExchange)
1525+ let changeEntry = if ((newChange >= 0))
1526+ then [IntegerEntry((pool + kPoolCapChange), newChange)]
1527+ else nil
1528+ (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
1529+ }
1530+ else throw("Strict value is not equal to itself.")
1531+ }
1532+ else throw("Strict value is not equal to itself.")
14891533 }))
14901534
14911535
14921536
14931537 @Callable(i)
14941538 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14951539 let pType = getStringValue(this, (kPool + pool))
1496- let $t05021350308 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1497- let claimedAmount = $t05021350308._1
1498- let claimedAsset = $t05021350308._2
1499- capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
1540+ let $t04853848636 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1541+ if (($t04853848636 == $t04853848636))
1542+ then {
1543+ let claimedAsset = $t04853848636._2
1544+ let claimedAmount = $t04853848636._1
1545+ capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
1546+ }
1547+ else throw("Strict value is not equal to itself.")
15001548 }))
15011549
15021550
15031551
15041552 @Callable(i)
1505-func initNewPool (type,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
1553+func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
15061554 then (type != WX_POOL)
15071555 else false)
15081556 then throw("Wrong type")
1509- else {
1510- let $t05073450828 = getPoolData(Address(fromBase58String(poolAddr)), type)
1511- let aId = $t05073450828._1
1512- let bId = $t05073450828._2
1513- let aBal = $t05073450828._3
1514- let bBal = $t05073450828._4
1515- let shareId = $t05073450828._5
1516- if ((0 > inFeeNoLoan))
1517- then throw("inFeeNoLoan must be greater than 0")
1518- else if ((0 > inFeeLoan))
1519- then throw("inFeeLoan must be greater than 0")
1520- else if ((0 > capFeeNoLoan))
1521- then throw("capFeeNoLoan must be greater than 0")
1522- else if ((0 > capFeeWithLoan))
1523- then throw("capFeeWithLoan must be greater than 0")
1524- else if ((0 > stoplossFeeNoLoan))
1525- then throw("stoplossFeeNoLoan must be greater than 0")
1526- else if ((0 > stoplossFeeWithLoan))
1527- then throw("stoplossFeeWithLoan must be greater than 0")
1528- else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
1529- }))
1557+ else if (if ((poolType != CPMM))
1558+ then (poolType != FLAT)
1559+ else false)
1560+ then throw("Wrong pool type")
1561+ else {
1562+ let $t04915749251 = getPoolData(Address(fromBase58String(poolAddr)), type)
1563+ let aId = $t04915749251._1
1564+ let bId = $t04915749251._2
1565+ let aBal = $t04915749251._3
1566+ let bBal = $t04915749251._4
1567+ let shareId = $t04915749251._5
1568+ if ((0 > inFeeNoLoan))
1569+ then throw("inFeeNoLoan must be greater than 0")
1570+ else if ((0 > inFeeLoan))
1571+ then throw("inFeeLoan must be greater than 0")
1572+ else if ((0 > capFeeNoLoan))
1573+ then throw("capFeeNoLoan must be greater than 0")
1574+ else if ((0 > capFeeWithLoan))
1575+ then throw("capFeeWithLoan must be greater than 0")
1576+ else if ((0 > stoplossFeeNoLoan))
1577+ then throw("stoplossFeeNoLoan must be greater than 0")
1578+ else if ((0 > stoplossFeeWithLoan))
1579+ then throw("stoplossFeeWithLoan must be greater than 0")
1580+ else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
1581+ }))
15301582
15311583
15321584
15331585 @Callable(i)
15341586 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
15351587 then throw(("Can't find pool with addr " + poolAddr))
15361588 else if ((0 > inFeeNoLoan))
15371589 then throw("inFeeNoLoan must be greater than 0")
15381590 else if ((0 > inFeeLoan))
15391591 then throw("inFeeLoan must be greater than 0")
15401592 else if ((0 > capFeeNoLoan))
15411593 then throw("capFeeNoLoan must be greater than 0")
15421594 else if ((0 > capFeeWithLoan))
15431595 then throw("capFeeWithLoan must be greater than 0")
15441596 else if ((0 > stoplossFeeNoLoan))
15451597 then throw("stoplossFeeNoLoan must be greater than 0")
15461598 else if ((0 > stoplossFeeWithLoan))
15471599 then throw("stoplossFeeWithLoan must be greater than 0")
15481600 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)]))
15491601
15501602
15511603
15521604 @Callable(i)
15531605 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
15541606 then throw("dApp already active")
15551607 else [BooleanEntry(kActive, true)])
15561608
15571609
15581610
15591611 @Callable(i)
15601612 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
15611613 then throw("dApp already shutdown")
15621614 else [BooleanEntry(kActive, false)])
15631615
15641616
15651617
15661618 @Callable(i)
15671619 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
15681620 then throw("dApp already active for users")
15691621 else [BooleanEntry(kActiveUsers, true)])
15701622
15711623
15721624
15731625 @Callable(i)
15741626 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
15751627 then throw("dApp already shutdown for users")
15761628 else [BooleanEntry(kActiveUsers, false)])
15771629
15781630
15791631
15801632 @Callable(i)
15811633 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
15821634 then throw("SWOPFI already active")
15831635 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
15841636
15851637
15861638
15871639 @Callable(i)
15881640 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
15891641 then throw("SWOPFI already shutdown")
15901642 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
15911643
15921644
15931645
15941646 @Callable(i)
15951647 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
15961648 then throw("WX already active")
15971649 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
15981650
15991651
16001652
16011653 @Callable(i)
16021654 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
16031655 then throw("WX already shutdown")
16041656 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
16051657
16061658
16071659
16081660 @Callable(i)
16091661 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16101662 then throw("Unknown pool")
16111663 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
16121664 then throw("Pool already active")
16131665 else [BooleanEntry((pool + kPoolActive), true)])
16141666
16151667
16161668
16171669 @Callable(i)
16181670 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16191671 then throw("Unknown pool")
16201672 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
16211673 then throw("Pool already shutdown")
16221674 else [BooleanEntry((pool + kPoolActive), false)])
16231675
16241676

github/deemru/w8io/3ef1775 
345.21 ms