tx · 8GaYxcg6T7fN1v5ayabnSZJGSDqtjDXPLY6zcq3HihT8

3N5dPcBenjbD5yoHNxR4cukNYEa8X1fqxzu:  -0.05800000 Waves

2023.08.09 15:18 [2703051] smart account 3N5dPcBenjbD5yoHNxR4cukNYEa8X1fqxzu > SELF 0.00000000 Waves

{ "type": 13, "id": "8GaYxcg6T7fN1v5ayabnSZJGSDqtjDXPLY6zcq3HihT8", "fee": 5800000, "feeAssetId": null, "timestamp": 1691583510382, "version": 2, "chainId": 84, "sender": "3N5dPcBenjbD5yoHNxR4cukNYEa8X1fqxzu", "senderPublicKey": "4NEiftwbhnxcZx118iiCyYyGbuWt6mKWu7N84FJPveJR", "proofs": [ "4Mm13Tast9DmB2vNSKKvLZbao3je3Nx5AWSz5h12UwNDopPmMbCckM9SKM3x9sTpgen4QwReS5V8sAhu1FHVfpYo", "2nXqMRXcgedn4BNmbjcyBSWnNaVATTNCGVyKkohBN98b1CtryzhGAMiuBCYnyfxyYPAZF1oLpFc5bQmTAR78ARj8" ], "script": "base64:BgLBAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEg0KCwgIAQQRGBgYAQEYEgkKBwgIAQQIARgSDQoLCAgBBBgYGBgYARgSBQoDCAQBEgsKCQgIAQEBAQEBBBIJCgcIAQEBAQEBEgASABIAEgASABIAEgASABIDCgEIEgMKAQiBAQAHU0ZfUE9PTAICU0YAB1dYX1BPT0wCAldYAA9DQVBfRkVFX05PX0xPQU4CCWNhcE5vTG9hbgAMQ0FQX0ZFRV9MT0FOAgdjYXBMb2FuABRTVE9QTE9TU19GRUVfTk9fTE9BTgIOc3RvcExvc3NOb0xvYW4ADVNUT1BMT1NTX0xPQU4CDHN0b3BMb3NzTG9hbgAITE9BTl9GRUUCBGxvYW4AC05PX0xPQU5fRkVFAgZub0xvYW4ABk5PX0ZFRQIFbm9GZWUABlNDQUxFOACAwtcvAAdTQ0FMRTEwAIDIr6AlAAdTQ0FMRTE2CQC2AgEAgICE/qbe4REACkZFRV9TQ0FMRTYAwIQ9ABRrU0ZQb29sQUFzc2V0QmFsYW5jZQIPQV9hc3NldF9iYWxhbmNlABRrU0ZQb29sQkFzc2V0QmFsYW5jZQIPQl9hc3NldF9iYWxhbmNlAA9rU0ZQb29sQUFzc2V0SWQCCkFfYXNzZXRfaWQAD2tTRlBvb2xCQXNzZXRJZAIKQl9hc3NldF9pZAAOa1NGUG9vbFNoYXJlSWQCDnNoYXJlX2Fzc2V0X2lkABJrU0ZQb29sU2hhcmVTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAKa1NGUG9vbEZlZQIKY29tbWlzc2lvbgANa1VzZXJQb3NpdGlvbgINX3VzZXJQb3NpdGlvbgARa1VzZXJQb3NpdGlvblBvb2wCEV91c2VyUG9zaXRpb25Qb29sABFrVXNlckJvcnJvd0Ftb3VudAIZX3VzZXJQb3NpdGlvbkJvcnJvd0Ftb3VudAASa1VzZXJCb3Jyb3dBc3NldElkAhpfdXNlclBvc2l0aW9uQm9ycm93QXNzZXRJZAAQa1VzZXJQb3NpdGlvbk51bQITX3VzZXJQb3NpdGlvbk51bWJlcgAVa1VzZXJQb3NpdGlvbkludGVyZXN0AhVfdXNlclBvc2l0aW9uSW50ZXJlc3QACmtQb29sVG90YWwCCl9wb29sVG90YWwADmtQb29sVG90YWxMb2FuAg5fcG9vbFRvdGFsTG9hbgARa1Bvb2xJbnRlcmVzdExvYW4CEV9wb29sSW50ZXJlc3RMb2FuABNrUG9vbEludGVyZXN0Tm9Mb2FuAhNfcG9vbEludGVyZXN0Tm9Mb2FuAA5rUG9vbENhbkJvcnJvdwIOX3Bvb2xDYW5Cb3Jyb3cAFWtBeGx5SW5GZWVXaXRob3V0TG9hbgIOX2F4bHlGZWVOb0xvYW4AEmtBeGx5SW5GZWVXaXRoTG9hbgIQX2F4bHlGZWVXaXRoTG9hbgARa0F4bHlOb0xvYW5DYXBGZWUCEV9heGx5RmVlQ2FwTm9Mb2FuABNrQXhseVdpdGhMb2FuQ2FwRmVlAhNfYXhseUZlZUNhcFdpdGhMb2FuABZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlAhhfYXhseUZlZVN0b3Bsb3NzV2l0aExvYW4AFGtBeGx5U3RvcExvc3NMb2FuRmVlAhZfYXhseUZlZVN0b3Bsb3NzTm9Mb2FuAAprUmVxdWVzdElkAgtfcmVxdWVzdF9pZAAMa1JlcXVlc3RJdGVyAg1yZXF1ZXN0c19pdGVyAAVrUG9vbAIFcG9vbF8ACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAJa01vbmV5Qm94Ag5heGx5X21vbmV5X2JveAAOa1NGRmFybWluZ0FkZHICE3N3b3BmaV9mYXJtaW5nX2FkZHIADGtMZW5kU2VydmljZQIRbGVuZF9zZXJ2aWNlX2FkZHIAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQALa0V4Q29udHJhY3QCEWV4Y2hhbmdlX2NvbnRyYWN0AA9rV3hTd2FwQ29udHJhY3QCEHd4X3N3YXBfY29udHJhY3QAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtNb25leUJveAIYTm8gYXhseSBtb25leUJveCBhZGRyZXNzAApleENvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFC2tFeENvbnRyYWN0AhxObyBleGNoYW5nZSBjb250cmFjdCBhZGRyZXNzAA9wcmljZU9yYWNsZUFkZHIJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa1d4U3dhcENvbnRyYWN0AhJObyB3eCBzd2FwIGFkZHJlc3MABlNXT1BJRAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUHa1N3b3BJZAIKTm8gc3dvcCBpZAAEV1hJRAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUFa1d4SWQCCE5vIHd4IGlkAA5ncm91cDFBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMUFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMVBLAA5ncm91cDFBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMUFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMlBLAA5ncm91cDJBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAA5ncm91cDJBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rT3BlcmF0b3JDYWxsUEsCFENhbid0IGdldCBvcGVyYXRvclBLAQ91bmtub3duUG9vbFR5cGUACQACAQIPV3JvbmcgcG9vbCB0eXBlAQ5nZXRMZW5kU3J2QWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUMa0xlbmRTZXJ2aWNlAhtDYW4ndCBnZXQgbGVuZCBzZXJ2aWNlIGFkZHIBDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4xUEsGCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjJQSwUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIJAQ5nZXRMZW5kU3J2QWRkcgAFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEIaXNBY3RpdmUAAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYGBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEQaXNBY3RpdmVGb3JVc2VycwADAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgYHBQR1bml0CQACAQIpREFwcCBpcyBpbmFjdGl2ZSBmb3IgdXNlcnMgYXQgdGhpcyBtb21lbnQBDGlzUG9vbEFjdGl2ZQIEcG9vbAR0eXBlBApXWFNGQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEdHlwZQULa0FjdGl2ZVNGV1gGBApwb29sQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGAwMFCldYU0ZBY3RpdmUFCnBvb2xBY3RpdmUHBgcBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yARFnZXRTRlBvb2xCYWxhbmNlcwEIcG9vbEFkZHIJAJQKAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQUFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBiYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xCQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGJhbGFuY2UBEWdldFdYUG9vbEJhbGFuY2VzAwhwb29sQWRkcgNhSWQDYklkCQCUCgIKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2FJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNiSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAEPZ2V0UG9vbEJhbGFuY2VzBAhwb29sQWRkcgR0eXBlA2FJZANiSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgUEdHlwZQUHV1hfUE9PTAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkCQEPdW5rbm93blBvb2xUeXBlAAENZ2V0U0ZQb29sRGF0YQEIcG9vbEFkZHIECyR0MDc4OTk3OTQ4CQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQskdDA3ODk5Nzk0OAULJHQwNzg5OTc5NDgEBGJhbEIIBQskdDA3ODk5Nzk0OAJfMgQEYmFsQQgFCyR0MDc4OTk3OTQ4Al8xCQCXCgUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEFBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xCQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAUEYmFsQQUEYmFsQgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ5rU0ZQb29sU2hhcmVJZAIYQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IGlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1nZXRXWFBvb2xEYXRhAQhwb29sQWRkcgQDY2ZnCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2NmZwUDY2ZnBANhSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAQDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkBANiSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAUDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBAdzaGFyZUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwADAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIaQ2FuJ3QgZ2V0IHBvb2wgTFAgYXNzZXQgaWQECyR0MDg2NDU4NzA0CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgULJHQwODY0NTg3MDQFCyR0MDg2NDU4NzA0BARiYWxCCAULJHQwODY0NTg3MDQCXzIEBGJhbEEIBQskdDA4NjQ1ODcwNAJfMQkAlwoFBQNhSWQFA2JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0UG9vbERhdGECCHBvb2xBZGRyBHR5cGUDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBDWdldFNGUG9vbERhdGEBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQENZ2V0V1hQb29sRGF0YQEFCHBvb2xBZGRyCQEPdW5rbm93blBvb2xUeXBlAAEOZ2V0U2hhcmVTdXBwbHkDCHBvb2xBZGRyBHR5cGUHc2hhcmVJZAMJAAACBQR0eXBlBQdTRl9QT09MCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFEmtTRlBvb2xTaGFyZVN1cHBseQIcQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IHN1cHBseQMJAAACBQR0eXBlBQdXWF9QT09MCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUHc2hhcmVJZAINV3JvbmcgU2hhcmVJZAhxdWFudGl0eQkBD3Vua25vd25Qb29sVHlwZQABEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQR1c2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4DCQAAAgUHZmVlVHlwZQUGTk9fRkVFAAAJAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDGFzc2V0SWRUb1N0cgEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgxOb3QgQXNzZXQgaWQBDmFzc2V0SWRGcm9tU3RyAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpdGlvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOAQ5nZXRBc3NldHNQcmljZQEIYXNzZXRJZHMKAQlnZXRQcmljZXMCAWEHYXNzZXRJZAQKYXNzZXRQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQkAzQgCBQFhBQphc3NldFByaWNlCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgENZ2V0U2hhcmVQcmljZQEHc2hhcmVJZAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAIgQ2FuJ3QgZmluZCBwb29sIGFkZHIgYnkgc2hhcmUgaWQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDExNjkzMTE3NTgJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDYUlkCAUNJHQwMTE2OTMxMTc1OAJfMQQDYklkCAUNJHQwMTE2OTMxMTc1OAJfMgQIYUJhbGFuY2UIBQ0kdDAxMTY5MzExNzU4Al8zBAhiQmFsYW5jZQgFDSR0MDExNjkzMTE3NTgCXzQEB2RQcmljZUEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQQHZFByaWNlQgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYklkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BAwMJAGYCAAAFB2RQcmljZUEGCQBmAgAABQdkUHJpY2VCAP///////////wEEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQECkFQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBApCUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQOc2hhcmVQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQdzaGFyZUlkAAAAAAUERE9XTgQDc3VtCQBkAgkAawMFCGFCYWxhbmNlBQdkUHJpY2VBBQpBUHJlY2lzaW9uCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24JAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQEOZ2V0U2hhcmVQcmljZXMBCHNoYXJlSWRzCgEJZ2V0UHJpY2VzAgFhB3NoYXJlSWQJAM0IAgUBYQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCgACJGwFCHNoYXJlSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEOZ2V0Q3Vyc0VudHJpZXMEA2FJZANiSWQHc2hhcmVJZAh3QW1vdW50cwQMYXNzZXRzUHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQKc2hhcmVQcmljZQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkBAZwcmljZXMJAM4IAgkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsBQh3QW1vdW50cwkAzAgCCQELU3RyaW5nRW50cnkCBQ9rVG9rZW5MYXN0UHJpY2UJALkJAgUGcHJpY2VzAgEsBQNuaWwBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwgFcFR5cGUIcG9vbEFkZHIEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCAwkAAAIFBXBUeXBlBQdTRl9QT09MBARyZXBsCgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICIGNhbGNMUFJlcGxlbmlzaFR3b1Rva2Vuc1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQRwbXRBCQDMCAIJAKQDAQUEcG10QgUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUEcmVwbAUEcmVwbAkAlwoFCgABQAkAkQMCBQRyZXBsAAMDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQRyZXBsAAQDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQRyZXBsAAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQEMYXNzZXRJZFRvU3RyAQkAkQMCBQRyZXBsAAIKAAFACQCRAwIFBHJlcGwAAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDEzMzcwMTM2MjAJAJQKAgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgIgZXZhbHVhdGVQdXRCeUFtb3VudEFzc2V0UkVBRE9OTFkJAMwIAgUEcG10QQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgIfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQkAzAgCBQRwbXRCBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFDSR0MDEzMzcwMTM2MjAFDSR0MDEzMzcwMTM2MjAECmV2YWxQdXRJbkIIBQ0kdDAxMzM3MDEzNjIwAl8yBApldmFsUHV0SW5BCAUNJHQwMTMzNzAxMzYyMAJfMQQFbHBJbkEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAEEBWxwSW5CCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgABAwkAZgIFBWxwSW5CBQVscEluQQQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQAICQCXCgUFBHBtdEEFA3BtdAkAZQIFBHBtdEIFA3BtdAUDYklkBQVscEluQgQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgAHCQCXCgUFA3BtdAUEcG10QgkAZQIFBHBtdEEFA3BtdAUDYUlkBQVscEluQQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYIcG9vbEFkZHIFcFR5cGUEcG10QQNhSWQEcG10QgNiSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNhSWQFBHBtdEEJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2JJZAUEcG10QgUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwkAzAgCCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcEBQhwb29sQWRkcgIDcHV0CQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUECHBvb2xBZGRyBXBUeXBlA3BtdAVwbXRJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFBXBtdElkBQNwbXQFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgkAzAgCCQDMCAICATAJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFCHBvb2xBZGRyAglwdXRPbmVUa24JAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTUyNzkxNTYyOQMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE1Mjc5MTU2MjkCXzEEBWZOYW1lCAUNJHQwMTUyNzkxNTYyOQJfMgQGcGFyYW1zCAUNJHQwMTUyNzkxNTYyOQJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNjA1MTE2MzU3AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE2MDUxMTYzNTcCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNjA1MTE2MzU3Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxNzA5NzE3MTM2CQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxNzA5NzE3MTM2Al8xBAVwckZlZQgFDSR0MDE3MDk3MTcxMzYCXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTcxNzYxNzQ4NAMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTcxNzYxNzQ4NAJfMQQKYXNzZXRUb1BheQgFDSR0MDE3MTc2MTc0ODQCXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0AwkAAAIFBXBUeXBlBQdTRl9QT09MBA0kdDAxNzgzMTE3OTUzCQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDE3ODMxMTc5NTMCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMTc4MzExNzk1MwJfMgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtb3VudFRva2VuVG9HZXQFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxODE1MzE4Mjc1CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDE4MTUzMTgyNzUCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMTgxNTMxODI3NQJfMgkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCBRBhbW91bnRUb2tlblRvR2V0CQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAkBD3Vua25vd25Qb29sVHlwZQABGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAhwb29sQWRkcgVwVHlwZQdzaGFyZUlkD3VzZXJDYW5XaXRoZHJhdwQNJHQwMTg1NjIxOTAyNgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICEHdpdGhkcmF3UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDaW52BQNpbnYJAJQKAgoAAUAJAJEDAgUDaW52AAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQNpbnYAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgITZXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAxODU2MjE5MDI2Al8xBAdhbW91bnRCCAUNJHQwMTg1NjIxOTAyNgJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDE5Mzk0MTk0NzMJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMTkzOTQxOTQ3MwJfMQQDYklkCAUNJHQwMTkzOTQxOTQ3MwJfMgQEYUJhbAgFDSR0MDE5Mzk0MTk0NzMCXzMEBGJCYWwIBQ0kdDAxOTM5NDE5NDczAl80BARscElkCAUNJHQwMTkzOTQxOTQ3MwJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQoFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkBA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDIwMDcxMjA0ODcDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIwMTM3MjAyNTMJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBQVwVHlwZQUIcG9vbEFkZHIFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMDEzNzIwMjUzAl8xBAZwbXRJbkIIBQ0kdDAyMDEzNzIwMjUzAl8yBAZjaGFuZ2UIBQ0kdDAyMDEzNzIwMjUzAl8zBAhjaGFuZ2VJZAgFDSR0MDIwMTM3MjAyNTMCXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMjAwNzEyMDQ4NwJfMQQIY2hhbmdlSWQIBQ0kdDAyMDA3MTIwNDg3Al8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAEBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCARwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbgQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBA0kdDAyMTM0NDIxNTgyAwUId2l0aExvYW4JAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50CQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgUPdG90YWxBbW91bnRMb2FuBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyMTM0NDIxNTgyAl8xBBN0b3RhbFN0YWtlZFdpdGhMb2FuCAUNJHQwMjEzNDQyMTU4MgJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgUTdG90YWxTdGFrZWRXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBDmV4Y2hhbmdlS2VlcGVyCgd0b1Rva2VuCXBtdEFtb3VudAhwbXRBc3NldAlhbW91bnRzSW4JYWRkcmVzc2VzD2Fzc2V0c1RvUmVjZWl2ZQtlc3RSZWNlaXZlZBFzbGlwcGFnZVRvbGVyYW5jZQttaW5SZWNlaXZlZAdvcHRpb25zBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA2ludgkA/AcEBQpleENvbnRyYWN0AgRzd2FwCQDMCAIFCWFtb3VudHNJbgkAzAgCBQlhZGRyZXNzZXMJAMwIAgUPYXNzZXRzVG9SZWNlaXZlCQDMCAIFC2VzdFJlY2VpdmVkCQDMCAIFEXNsaXBwYWdlVG9sZXJhbmNlCQDMCAIFC21pblJlY2VpdmVkCQDMCAIFB29wdGlvbnMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIcG10QXNzZXQFCXBtdEFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5leGNoYW5nZVB1enpsZQYHdG9Ub2tlbglwbXRBbW91bnQIcG10QXNzZXQJcm91dGVzU3RyDG1pblRvUmVjZWl2ZQdvcHRpb25zBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA2ludgkA/AcEBQpleENvbnRyYWN0AgpwdXp6bGVTd2FwCQDMCAIFCXJvdXRlc1N0cgkAzAgCBQxtaW5Ub1JlY2VpdmUJAMwIAgUHb3B0aW9ucwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhwbXRBc3NldAUJcG10QW1vdW50BQNuaWwDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmV4Y2hhbmdlU3dvcEZpCgd0b1Rva2VuCXBtdEFtb3VudAhwbXRBc3NldApleGNoYW5nZXJzDmV4Y2hhbmdlcnNUeXBlBWFyZ3MxBWFyZ3MyEXJvdXRpbmdBc3NldHNLZXlzEm1pbkFtb3VudFRvUmVjZWl2ZQdvcHRpb25zBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA2ludgkA/AcEBQpleENvbnRyYWN0Agpzd29wZmlTd2FwCQDMCAIFCmV4Y2hhbmdlcnMJAMwIAgUOZXhjaGFuZ2Vyc1R5cGUJAMwIAgUFYXJnczEJAMwIAgUFYXJnczIJAMwIAgURcm91dGluZ0Fzc2V0c0tleXMJAMwIAgUSbWluQW1vdW50VG9SZWNlaXZlCQDMCAIFB29wdGlvbnMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIcG10QXNzZXQFCXBtdEFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQpjYXBpdGFsaXplBARwb29sBXBUeXBlB3Rva2VuSWQLdG9rZW5BbW91bnQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQNJHQwMjM5MzYyNDAwMgkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANBSWQIBQ0kdDAyMzkzNjI0MDAyAl8xBANCSWQIBQ0kdDAyMzkzNjI0MDAyAl8yBARiYWxBCAUNJHQwMjM5MzYyNDAwMgJfMwQEYmFsQggFDSR0MDIzOTM2MjQwMDICXzQEB3NoYXJlSWQIBQ0kdDAyMzkzNjI0MDAyAl81AwMJAQIhPQIFB3Rva2VuSWQFA0FJZAkBAiE9AgUHdG9rZW5JZAUDQklkBwkAAgECC1dyb25nIGFzc2V0BBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQLbG9hblBlcmNlbnQJAGsDBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FBlNDQUxFOAUQdG90YWxTaGFyZUFtb3VudAQQdG9rZW5zRm9yRmVlTG9hbgkAawMFC3Rva2VuQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BBJ0b2tlbnNGb3JGZWVOb0xvYW4JAGUCBQt0b2tlbkFtb3VudAUQdG9rZW5zRm9yRmVlTG9hbgQLYXhseUZlZUxvYW4JAGsDBRB0b2tlbnNGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQNYXhseUZlZU5vTG9hbgkAawMFEnRva2Vuc0ZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEB2F4bHlGZWUJAGQCBQtheGx5RmVlTG9hbgUNYXhseUZlZU5vTG9hbgQNJHQwMjQ2NDIyNDc0MgMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlAAAJAJQKAgAACQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUEBHBtdEEIBQ0kdDAyNDY0MjI0NzQyAl8xBARwbXRCCAUNJHQwMjQ2NDIyNDc0MgJfMgQNJHQwMjQ3NDUyNDg0OQkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQZOT19GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAxzdGFrZWRBbW91bnQIBQ0kdDAyNDc0NTI0ODQ5Al8xBAJuZggFDSR0MDI0NzQ1MjQ4NDkCXzIEE2N1clBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBVjdXJQb29sSW50ZXJlc3ROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAECnN0YWtlZExvYW4JAGsDBQxzdGFrZWRBbW91bnQFC2xvYW5QZXJjZW50BQZTQ0FMRTgEDHN0YWtlZE5vTG9hbgkAZQIFDHN0YWtlZEFtb3VudAUKc3Rha2VkTG9hbgQPbmV3SW50ZXJlc3RMb2FuAwkAZgIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUTY3VyUG9vbEludGVyZXN0TG9hbgkAawMFCnN0YWtlZExvYW4FB1NDQUxFMTAFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAABBFuZXdJbnRlcmVzdE5vTG9hbgMJAGYCCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRVjdXJQb29sSW50ZXJlc3ROb0xvYW4JAGsDBQxzdGFrZWROb0xvYW4FB1NDQUxFMTAJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuBQ9uZXdJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgURbmV3SW50ZXJlc3ROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFEHRvdGFsU2hhcmVBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUKc3Rha2VkTG9hbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUHYXhseUZlZQkA2QQBBQd0b2tlbklkBQNuaWwJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkBQNuaWwBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQEdXNlcgRwb29sBXBvc0lkCGJvcnJvd2VkBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAx1c2VySW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0BAxwb29sSW50ZXJlc3QDBQhib3Jyb3dlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuCQBkAgUHcEFtb3VudAkAawMFB3BBbW91bnQJAGUCBQxwb29sSW50ZXJlc3QFDHVzZXJJbnRlcmVzdAUHU0NBTEUxMAEPY2FsY1N0b3BMb3NzRmVlBARwb29sCmlzQm9ycm93ZWQIc3RvcExvc3MKbHBXaXRoZHJhdwQHZmVlVHlwZQMFCmlzQm9ycm93ZWQFDVNUT1BMT1NTX0xPQU4FFFNUT1BMT1NTX0ZFRV9OT19MT0FOAwUIc3RvcExvc3MJAGsDBQpscFdpdGhkcmF3CQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYAAAEOd2l0aGRyYXdUb1VzZXIEBHVzZXIEcG9vbAVwb3NJZAhzdG9wTG9zcwQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQKaXNCb3Jyb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAAAAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBXBvc0lkBQppc0JvcnJvd2VkBA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwMjczODAyNzQ1MgkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDAyNzM4MDI3NDUyAl8xBAZpZEJTdHIIBQ0kdDAyNzM4MDI3NDUyAl8yBARiYWxBCAUNJHQwMjczODAyNzQ1MgJfMwQEYmFsQggFDSR0MDI3MzgwMjc0NTICXzQEB3NoYXJlSWQIBQ0kdDAyNzM4MDI3NDUyAl81BA0kdDAyNzQ1NTI3NTIyCQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDAyNzQ1NTI3NTIyAl8xBANpZEIIBQ0kdDAyNzQ1NTI3NTIyAl8yBAtzdG9wTG9zc0ZlZQkBD2NhbGNTdG9wTG9zc0ZlZQQFBHBvb2wFCmlzQm9ycm93ZWQFCHN0b3BMb3NzBQ91c2VyQ2FuV2l0aGRyYXcEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MBANpbnYJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAULc3RvcExvc3NGZWUDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAgh3aXRoZHJhdwkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAZAIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICA2dldAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQADCQAAAgUDaW52BQNpbnYECmNCYWxBQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQpjQmFsQUFmdGVyBQpjQmFsQUFmdGVyBApjQmFsQkFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUKY0JhbEJBZnRlcgUKY0JhbEJBZnRlcgQNJHQwMjgyMTcyODMwNgkAlAoCCQBlAgUKY0JhbEFBZnRlcgULY0JhbEFCZWZvcmUJAGUCBQpjQmFsQkFmdGVyBQtjQmFsQkJlZm9yZQQNdG9rZW5zQW1vdW50QQgFDSR0MDI4MjE3MjgzMDYCXzEEDXRva2Vuc0Ftb3VudEIIBQ0kdDAyODIxNzI4MzA2Al8yBA0kdDAyODMwOTI5NTQ1AwUKaXNCb3Jyb3dlZAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkCQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEC2Nsb3NlRGJ0SW52AwkAZgIFBGRlYnQAAAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAghyZXBheUZvcgkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQULYm9ycm93QXNzZXQFBGRlYnQFA25pbAAAAwkAAAIFC2Nsb3NlRGJ0SW52BQtjbG9zZURidEludgMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQCUCgIJAGUCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQUEZGVidAkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUJAJQKAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUJAGUCCQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQUEZGVidAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQ10b2tlbnNBbW91bnRBBQ10b2tlbnNBbW91bnRCBAd0b1VzZXJBCAUNJHQwMjgzMDkyOTU0NQJfMQQHdG9Vc2VyQggFDSR0MDI4MzA5Mjk1NDUCXzIEFHBvb2xUb3RhbExvYW5FbnRyaWVzAwUKaXNCb3Jyb3dlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZQIJAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFA25pbAUDbmlsBAdlbnRyaWVzCQDOCAIJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyUG9zaXRpb25Qb29sCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgUHdG9Vc2VyQQUDaWRBCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJCBQNpZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3N0b3BMb3NzRmVlCQDZBAEFB3NoYXJlSWQFA25pbAUUcG9vbFRvdGFsTG9hbkVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwJAJQKAgUHZW50cmllcwkAzAgCBQd0b1VzZXJBCQDMCAIFB3RvVXNlckIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKCQCdCgsFBHVzZXIFBHBvb2wFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQdid0Fzc2V0BQhid0Ftb3VudAEQY2FsY0JvcnJvd0Ftb3VudAYEcG10QQRwbXRCA2FJZANiSWQIbGV2ZXJhZ2UIYm9ycm93SWQDAwkBAiE9AgUIYm9ycm93SWQFA2FJZAkBAiE9AgUIYm9ycm93SWQFA2JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEB2RQcmljZUEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNhSWQFDmtQcmljZUluT3JhY2xlBAdkUHJpY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYklkBQ5rUHJpY2VJbk9yYWNsZQQGZGVjUHJBCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQGZGVjUHJCCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQMcGF5ZEluRG9sbGFyCQBkAgkAawMFB2RQcmljZUEFBHBtdEEFBmRlY1ByQQkAawMFB2RQcmljZUIFBHBtdEIFBmRlY1ByQgQNJHQwMzE1MjczMTYyNAMJAAACBQhib3Jyb3dJZAUDYUlkCQCUCgIFB2RQcmljZUEFBmRlY1ByQQkAlAoCBQdkUHJpY2VCBQZkZWNQckIEC2JvcnJvd1ByaWNlCAUNJHQwMzE1MjczMTYyNAJfMQQLYm9ycm93RGVjUHIIBQ0kdDAzMTUyNzMxNjI0Al8yCQBrAwkAawMFDHBheWRJbkRvbGxhcgkAZQIFCGxldmVyYWdlAGQAZAULYm9ycm93RGVjUHIFC2JvcnJvd1ByaWNlARJwYXJzZVJlcGxlbmlzaFBtdHMDBHBtdHMDQUlkA0JJZAMJAAACCQCQAwEFBHBtdHMAAgMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBBAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAQdhc3NldElkBQNCSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEIJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAgJAJEDAgUEcG10cwABBmFtb3VudAMJAAACCQCQAwEFBHBtdHMAAQMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50AAADCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNCSWQJAJQKAgAACAkAkQMCBQRwbXRzAAAGYW1vdW50CQACAQINV3JvbmcgcGF5bWVudAkAAgECHE9uZSBvciB0d28gcGF5bWVudHMgZXhwZWN0ZWQBD2NhbGNQcmljZUltcGFjdAQEYmFsQQRiYWxCB25ld0JhbEEHbmV3QmFsQgQDcHJpCQBoAgkAZQIFBlNDQUxFOAkAawMJAGsDBQRiYWxCBQZTQ0FMRTgFBGJhbEEFBlNDQUxFOAkAawMFB25ld0JhbEIFBlNDQUxFOAUHbmV3QmFsQQBkAwkAZgIAAAUDcHJpCQBoAgUDcHJpAP///////////wEFA3ByaQERY2xhaW1BbmRDaGVja0FtbnQFBHBvb2wFcFR5cGUFY2xhaW0GYW1vdW50BmNoYW5nZQQNJHQwMzI2MjQzMjg4MwMFBWNsYWltCQELY2xhaW1GYXJtZWQCBQVwVHlwZQUEcG9vbAQMY2xhaW1lZEFzc2V0AwkAAAIFBXBUeXBlBQdTRl9QT09MBQZTV09QSUQDCQAAAgUFcFR5cGUFB1dYX1BPT0wFBFdYSUQJAQ91bmtub3duUG9vbFR5cGUACQCUCgIFBmFtb3VudAUMY2xhaW1lZEFzc2V0BAtjbGFpbUFtb3VudAgFDSR0MDMyNjI0MzI4ODMCXzEECmNsYWltQXNzZXQIBQ0kdDAzMjYyNDMyODgzAl8yBANiYWwJAQ5hY2NvdW50QmFsYW5jZQEFCmNsYWltQXNzZXQDAwkAZgIFBmFtb3VudAkAZAIFC2NsYWltQW1vdW50BQZjaGFuZ2UGCQBmAgUGYW1vdW50BQNiYWwJAAIBAhlUbyBiaWcgYW1vdW50IHRvIGV4Y2hhbmdlCQCUCgIFC2NsYWltQW1vdW50BQpjbGFpbUFzc2V0HQFpARNnZXRQb29sSW5mb1JFQURPTkxZAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDMzMjgwMzMzNzAJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzMyODAzMzM3MAJfMQQDQklkCAUNJHQwMzMyODAzMzM3MAJfMgQEYmFsQQgFDSR0MDMzMjgwMzMzNzACXzMEBGJhbEIIBQ0kdDAzMzI4MDMzMzcwAl80BAdzaGFyZUlkCAUNJHQwMzMyODAzMzM3MAJfNQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAkAlAoCBQNuaWwJAJgKBgUDQUlkBQNCSWQFB3NoYXJlSWQFBGJhbEEFBGJhbEIFC3NoYXJlU3VwcGx5AWkBGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZAQdzaGFyZUlkBAtzaGFyZVByaWNlcwkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCQCUCgIFA25pbAULc2hhcmVQcmljZXMBaQEiZ2V0VXNlclBvc2l0aW9uU2hhcmVBbW91bnRSRUFET05MWQIEdXNlcgZwb3NOdW0EBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sAhBVbmtub3duIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sBQZwb3NOdW0JAGYCBQxib3Jyb3dBbW91bnQAAAkAlAoCBQNuaWwFD3VzZXJDYW5XaXRoZHJhdwFpARdnZXRVc2VyUG9zaXRpb25SRUFET05MWQMEdXNlcgVwb29scwZwb3NOdW0KAQd1c2VyUG9zAgFhBHBvb2wEDSR0MDM0MjQzMzQzMTMFAWEECXdBbW91bnRzQQgFDSR0MDM0MjQzMzQzMTMCXzEECXdBbW91bnRzQggFDSR0MDM0MjQzMzQzMTMCXzIEBWRlYnRzCAUNJHQwMzQyNDMzNDMxMwJfMwQLZXFXQW1vdW50c0EIBQ0kdDAzNDI0MzM0MzEzAl80BAtlcVdBbW91bnRzQggFDSR0MDM0MjQzMzQzMTMCXzUEBWluZGV4CAUNJHQwMzQyNDMzNDMxMwJfNgMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUNa1VzZXJQb3NpdGlvbgkAmAoGCQDNCAIFCXdBbW91bnRzQQAACQDNCAIFCXdBbW91bnRzQgAACQDNCAIFBWRlYnRzAAAJAM0IAgULZXFXQW1vdW50c0EAAAkAzQgCBQtlcVdBbW91bnRzQgAACQBkAgUFaW5kZXgAAQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDM0NTkyMzQ2ODIJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzQ1OTIzNDY4MgJfMQQDQklkCAUNJHQwMzQ1OTIzNDY4MgJfMgQEYmFsQQgFDSR0MDM0NTkyMzQ2ODICXzMEBGJhbEIIBQ0kdDAzNDU5MjM0NjgyAl80BAdzaGFyZUlkCAUNJHQwMzQ1OTIzNDY4MgJfNQQMYm9ycm93QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEWtVc2VyQm9ycm93QW1vdW50AAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wJAJEDAgUGcG9zTnVtBQVpbmRleAkAZgIFDGJvcnJvd0Ftb3VudAAABA0kdDAzNDg5ODM1MDE4CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwQId0Ftb3VudEEIBQ0kdDAzNDg5ODM1MDE4Al8xBAh3QW1vdW50QggFDSR0MDM0ODk4MzUwMTgCXzIDCQBmAgUMYm9ycm93QW1vdW50AAAEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4CQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAZgIFBGRlYnQFCHdBbW91bnRBBwkAZQIFBGRlYnQFCHdBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUDQklkCQBmAgUEZGVidAUId0Ftb3VudEIHCQBlAgUEZGVidAUId0Ftb3VudEIAAAQLYW1vdW50VG9QYXkDCQBmAgUNYW1vdW50VG9HZXRFeAAAAwkAAAIFBXBUeXBlBQdTRl9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVNGBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgkBD3Vua25vd25Qb29sVHlwZQAAAAQNJHQwMzU5MzAzNjE0OQMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQCUCgIJAGUCCQBkAgUId0Ftb3VudEEFDWFtb3VudFRvR2V0RXgFBGRlYnQJAGUCBQh3QW1vdW50QgULYW1vdW50VG9QYXkJAJQKAgkAZQIFCHdBbW91bnRBBQthbW91bnRUb1BheQkAZQIJAGQCBQh3QW1vdW50QgUNYW1vdW50VG9HZXRFeAUEZGVidAQKZXFXQW1vdW50QQgFDSR0MDM1OTMwMzYxNDkCXzEECmVxV0Ftb3VudEIIBQ0kdDAzNTkzMDM2MTQ5Al8yCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQDNCAIFBWRlYnRzBQRkZWJ0CQDNCAIFC2VxV0Ftb3VudHNBBQplcVdBbW91bnRBCQDNCAIFC2VxV0Ftb3VudHNCBQplcVdBbW91bnRCCQBkAgUFaW5kZXgAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgUFZGVidHMJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQBkAgUFaW5kZXgAAQQNJHQwMzY0MDQzNjUxNQoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJgKBgUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHdXNlclBvcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAl3QW1vdW50c0EIBQ0kdDAzNjQwNDM2NTE1Al8xBAl3QW1vdW50c0IIBQ0kdDAzNjQwNDM2NTE1Al8yBAVkZWJ0cwgFDSR0MDM2NDA0MzY1MTUCXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzY0MDQzNjUxNQJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzNjQwNDM2NTE1Al81CQCUCgIFA25pbAkAlwoFBQl3QW1vdW50c0EFCXdBbW91bnRzQgUFZGVidHMFC2VxV0Ftb3VudHNBBQtlcVdBbW91bnRzQgFpAQlyZXBsZW5pc2gDBHBvb2wIbGV2ZXJhZ2UIYm9ycm93SWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQBmAgBkBQhsZXZlcmFnZQYJAGYCBQhsZXZlcmFnZQCsAgkAAgECH0xldmVyYWdlIGNhbid0IGJlIDwxMDAgYW5kID4zMDADAwkBASEBCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FuQm9ycm93CQBmAgUIbGV2ZXJhZ2UAZAcJAAIBAh1Zb3UgY2FuJ3QgYm9ycm93IGluIHRoaXMgcG9vbAQNJHQwMzcxMTMzNzIwMwkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzNzExMzM3MjAzAl8xBANCSWQIBQ0kdDAzNzExMzM3MjAzAl8yBARiYWxBCAUNJHQwMzcxMTMzNzIwMwJfMwQEYmFsQggFDSR0MDM3MTEzMzcyMDMCXzQEB3NoYXJlSWQIBQ0kdDAzNzExMzM3MjAzAl81AwMJAQIhPQIFCGJvcnJvd0lkBQNBSWQJAQIhPQIFCGJvcnJvd0lkBQNCSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0BA0kdDAzNzI4NDM3MzQzCQEScGFyc2VSZXBsZW5pc2hQbXRzAwgFAWkIcGF5bWVudHMFA0FJZAUDQklkBARwbXRBCAUNJHQwMzcyODQzNzM0MwJfMQQEcG10QggFDSR0MDM3Mjg0MzczNDMCXzIEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAluZXdQb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyAwkAZgIFCGxldmVyYWdlAGQEDGJvcnJvd0Ftb3VudAkBEGNhbGNCb3Jyb3dBbW91bnQGBQRwbXRBBQRwbXRCBQNBSWQFA0JJZAUIbGV2ZXJhZ2UFCGJvcnJvd0lkBAdyZXF1ZXN0CQC5CQIJAMwIAgUEdXNlcgkAzAgCBQRwb29sCQDMCAIJAKQDAQUEcG10QQkAzAgCBQNBSWQJAMwIAgkApAMBBQRwbXRCCQDMCAIFA0JJZAkAzAgCCQCkAwEFBGJhbEEJAMwIAgkApAMBBQRiYWxCCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgkApAMBBQxib3Jyb3dBbW91bnQFA25pbAIBLAQMbmV3UmVxdWVzdElkCgABQAkA/AcEBQR0aGlzAhBjcmVhdGVOZXdSZXF1ZXN0CQDMCAIFB3JlcXVlc3QFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQxuZXdSZXF1ZXN0SWQFDG5ld1JlcXVlc3RJZAQEYXJncwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQluZXdQb3NOdW0JAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCBQxib3Jyb3dBbW91bnQJAMwIAgkApQgBBQR0aGlzCQDMCAICEXJlcGxlbmlzaEZyb21MYW5kCQDMCAIJAKQDAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQxuZXdSZXF1ZXN0SWQCGENhbid0IGNyZWF0ZSBuZXcgcmVxdWVzdAUDbmlsBANpbnYJAP0HBAkBDmdldExlbmRTcnZBZGRyAAINZmxhc2hQb3NpdGlvbgUEYXJncwUDbmlsAwkAAAIFA2ludgUDaW52BAp1c2VyU3Rha2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQluZXdQb3NOdW0FDWtVc2VyUG9zaXRpb24EDSR0MDM4MzMyMzg0MjYJAQ9nZXRQb29sQmFsYW5jZXMECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFA0FJZAUDQklkAwkAAAIFDSR0MDM4MzMyMzg0MjYFDSR0MDM4MzMyMzg0MjYEB25ld0JhbEIIBQ0kdDAzODMzMjM4NDI2Al8yBAduZXdCYWxBCAUNJHQwMzgzMzIzODQyNgJfMQQIcHJJbXBhY3QJAQ9jYWxjUHJpY2VJbXBhY3QEBQRiYWxBBQRiYWxCBQduZXdCYWxBBQduZXdCYWxCBA0kdDAzODQ5NjM4NjExCQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwMzg0OTYzODYxMQJfMQQId0Ftb3VudEIIBQ0kdDAzODQ5NjM4NjExAl8yCQCUCgIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAzODY2NDM4Nzc5CQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFC05PX0xPQU5fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAMJAAACBQ0kdDAzODY2NDM4Nzc5BQ0kdDAzODY2NDM4Nzc5BAdheGx5RmVlCAUNJHQwMzg2NjQzODc3OQJfMgQKdXNlclN0YWtlZAgFDSR0MDM4NjY0Mzg3NzkCXzEEDSR0MDM4Nzg1Mzg4NzkJAQ9nZXRQb29sQmFsYW5jZXMECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFA0FJZAUDQklkAwkAAAIFDSR0MDM4Nzg1Mzg4NzkFDSR0MDM4Nzg1Mzg4NzkEB25ld0JhbEIIBQ0kdDAzODc4NTM4ODc5Al8yBAduZXdCYWxBCAUNJHQwMzg3ODUzODg3OQJfMQQIcHJJbXBhY3QJAQ9jYWxjUHJpY2VJbXBhY3QEBQRiYWxBBQRiYWxCBQduZXdCYWxBBQduZXdCYWxCBA0kdDAzODk0OTM5MDY0CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwMzg5NDkzOTA2NAJfMQQId0Ftb3VudEIIBQ0kdDAzODk0OTM5MDY0Al8yCQCUCgIJAM4IAgkBEHJlcGxlbmlzaEVudHJpZXMIBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQluZXdQb3NOdW0FB3NoYXJlSWQFBXBUeXBlBwkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQJAMwIAgkApAMBBQh3QW1vdW50QQkAzAgCCQCkAwEFCHdBbW91bnRCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwIEcG9vbAVwb3NJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50CQEOd2l0aGRyYXdUb1VzZXIECQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAcBaQEUY3JlYXRlVXBkYXRlU3RvcExvc3MEBXBvc0lkBnBvb2xJZAdhc3NldElkBXByaWNlCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZwb29sSWQCAV8JAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQACAQIaVGhlcmUgYXJlIG5vIHVzZXIgcG9zaXRpb24DCQBnAgAABQVwcmljZQkAAgECHFByaWNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgUFcHJpY2UFEHRva2VuT3JhY2xlUHJpY2UJAAIBAitQcmljZSBtdXN0IGJlIGxlc3MgdGhhbiBjdXJyZW50IHRva2VuIHByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFBXByaWNlBQNuaWwBaQEOZGVsZXRlU3RvcExvc3MDBXBvc0lkBnBvb2xJZAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MJAAIBAghObyBlbnRyeQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFA25pbAFpAQRpbml0DQxtb25leUJveEFkZHINc2ZGYXJtaW5nQWRkcghsZW5kQWRkcg9wcmljZU9yYWNsZUFkZHIQa2VlcGVyRXhDb250cmFjdA53eFN3YXBDb250cmFjdAtzd29wQXNzZXRJZAl3eEFzc2V0SWQOb3BlcmF0b3JQdWJLZXkSZ3JvdXAxQWRtaW4xUHViS2V5Emdyb3VwMUFkbWluMlB1YktleRJncm91cDJBZG1pbjFQdWJLZXkSZ3JvdXAyQWRtaW4yUHViS2V5CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAoggBBQ9rT3BlcmF0b3JDYWxsUEsJAAIBAg5BbHJlYWR5IGluaXRlZAMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUMbW9uZXlCb3hBZGRyCQACAQIjbW9uZXlCb3hBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDXNmRmFybWluZ0FkZHIJAAIBAiRzZkZhcm1pbmdBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFCGxlbmRBZGRyCQACAQIfbGVuZEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUPcHJpY2VPcmFjbGVBZGRyCQACAQImcHJpY2VPcmFjbGVBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFEGtlZXBlckV4Q29udHJhY3QJAAIBAidrZWVwZXJFeENvbnRyYWN0IGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQULc3dvcEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQl3eEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQIhPQIJAMgBAQkA2QQBBQ5vcGVyYXRvclB1YktleQAgCQACAQIdb3BlcmF0b3JQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa01vbmV5Qm94BQxtb25leUJveEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa1NGRmFybWluZ0FkZHIFDXNmRmFybWluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa0xlbmRTZXJ2aWNlBQhsZW5kQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrUHJpY2VPcmFjbGUFD3ByaWNlT3JhY2xlQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQtrRXhDb250cmFjdAUQa2VlcGVyRXhDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rV3hTd2FwQ29udHJhY3QFDnd4U3dhcENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tTd29wSWQFC3N3b3BBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtXeElkBQl3eEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa09wZXJhdG9yQ2FsbFBLBQ5vcGVyYXRvclB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4xUEsFEmdyb3VwMUFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4yUEsFEmdyb3VwMUFkbWluMlB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4xUEsFEmdyb3VwMkFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4yUEsFEmdyb3VwMkFkbWluMlB1YktleQUDbmlsAWkBEGNyZWF0ZU5ld1JlcXVlc3QBBnBhcmFtcwkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpBAxuZXdSZXF1ZXN0SWQJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtSZXF1ZXN0SXRlcgAAAAEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQUMbmV3UmVxdWVzdElkBQprUmVxdWVzdElkBQZwYXJhbXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtSZXF1ZXN0SXRlcgUMbmV3UmVxdWVzdElkBQNuaWwFDG5ld1JlcXVlc3RJZAFpARFyZXBsZW5pc2hGcm9tTGFuZAEJcmVxdWVzdElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEDSR0MDQzOTAzNDQwMDcJAQxwYXJzZVJlcXVlc3QBBQlyZXF1ZXN0SWQEBHVzZXIIBQ0kdDA0MzkwMzQ0MDA3Al8xBARwb29sCAUNJHQwNDM5MDM0NDAwNwJfMgQEcG10QQgFDSR0MDQzOTAzNDQwMDcCXzMEA0FJZAgFDSR0MDQzOTAzNDQwMDcCXzQEBHBtdEIIBQ0kdDA0MzkwMzQ0MDA3Al81BANCSWQIBQ0kdDA0MzkwMzQ0MDA3Al82BARiYWxBCAUNJHQwNDM5MDM0NDAwNwJfNwQEYmFsQggFDSR0MDQzOTAzNDQwMDcCXzgEB3NoYXJlSWQIBQ0kdDA0MzkwMzQ0MDA3Al85BAdid0Fzc2V0CAUNJHQwNDM5MDM0NDAwNwNfMTAECGJ3QW1vdW50CAUNJHQwNDM5MDM0NDAwNwNfMTEDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhJXcm9uZyBwYXltZW50IHNpemUDAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUHYndBc3NldAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQhid0Ftb3VudAkAAgECDVdyb25nIHBheW1lbnQEDSR0MDQ0MTk3NDQyOTcDCQAAAgUDQUlkBQdid0Fzc2V0CQCUCgIJAGQCBQRwbXRBBQhid0Ftb3VudAUEcG10QgkAlAoCBQRwbXRBCQBkAgUEcG10QgUIYndBbW91bnQEB3BtdEFsbEEIBQ0kdDA0NDE5NzQ0Mjk3Al8xBAdwbXRBbGxCCAUNJHQwNDQxOTc0NDI5NwJfMgQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDQ0Mzc5NDQ0OTQJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUITE9BTl9GRUUFB3BtdEFsbEEFA0FJZAUHcG10QWxsQgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAp1c2VyU3Rha2VkCAUNJHQwNDQzNzk0NDQ5NAJfMQQHYXhseUZlZQgFDSR0MDQ0Mzc5NDQ0OTQCXzIEBnBvc051bQkBGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEFBHVzZXIEDWJvcnJvd0VudHJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQFCGJ3QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUSa1VzZXJCb3Jyb3dBc3NldElkBQdid0Fzc2V0BQNuaWwEB2VudHJpZXMJARByZXBsZW5pc2hFbnRyaWVzCAUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUGcG9zTnVtBQdzaGFyZUlkBQVwVHlwZQYEDSR0MDQ0ODU0NDQ5NjkJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA0NDg1NDQ0OTY5Al8xBAh3QW1vdW50QggFDSR0MDQ0ODU0NDQ5NjkCXzIJAJQKAgkAzQgCCQDOCAIJAM4IAgUHZW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQJAMwIAgkApAMBBQh3QW1vdW50QQkAzAgCCQCkAwEFCHdBbW91bnRCBQNuaWwFDWJvcnJvd0VudHJpZXMJAQtEZWxldGVFbnRyeQEJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkBQp1c2VyU3Rha2VkAWkBCWxpcXVpZGF0ZQMEdXNlcgVwb3NJZA9saXF1aWRhdGVBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBRFrVXNlclBvc2l0aW9uUG9vbAILbm8gcG9zaXRpb24EBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDA0NTQ5MDQ1NTgwCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDQ1NDkwNDU1ODACXzEEA0JJZAgFDSR0MDQ1NDkwNDU1ODACXzIEBGJhbEEIBQ0kdDA0NTQ5MDQ1NTgwAl8zBARiYWxCCAUNJHQwNDU0OTA0NTU4MAJfNAQHc2hhcmVJZAgFDSR0MDQ1NDkwNDU1ODACXzUEBmFtb3VudAkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ9saXF1aWRhdGVBbW91bnQEDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sBQVwb3NJZAkAZgIFDGJvcnJvd0Ftb3VudAAAAwkAZgIFD2xpcXVpZGF0ZUFtb3VudAUPdXNlckNhbldpdGhkcmF3CQACAQInWW91IGNhbid0IGxpcXVpZGF0ZSBtb3JlIHRoYW4gdXNlciBoYXZlAwkAAAIFDGJvcnJvd0Ftb3VudAAACQACAQIrWW91IGNhbid0IGxpcXVpZGF0ZSBwb3NpdGlvbiB3aXRob3V0IGJvcnJvdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAGUCBQ91c2VyQ2FuV2l0aGRyYXcFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBaQEIc3RvcExvc3MEBHVzZXIFcG9zSWQEcG9vbAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEDXN0b3BMb3NzUHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MCCE5vIGVudHJ5AwkAZgIFEHRva2VuT3JhY2xlUHJpY2UFDXN0b3BMb3NzUHJpY2UJAAIBAiNUb2tlbiBwcmljZSBncmVhdGVyIHN0b3AgbG9zcyBwcmljZQQDcmVzCQEOd2l0aGRyYXdUb1VzZXIEBQR1c2VyBQRwb29sCQCkAwEFBXBvc0lkBgkAlAoCCQDNCAIIBQNyZXMCXzEJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwgFA3JlcwJfMgFpARJjYXBpdGFsaXplRXhLZWVwZXILBHBvb2wJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0JYW1vdW50c0luCWFkZHJlc3Nlcw9hc3NldHNUb1JlY2VpdmULZXN0UmVjZWl2ZWQRc2xpcHBhZ2VUb2xlcmFuY2ULbWluUmVjZWl2ZWQHb3B0aW9ucwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEBmNoYW5nZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlAAAEDSR0MDQ3NzI5NDc4MjgJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQUGY2hhbmdlBA1jbGFpbWVkQW1vdW50CAUNJHQwNDc3Mjk0NzgyOAJfMQQMY2xhaW1lZEFzc2V0CAUNJHQwNDc3Mjk0NzgyOAJfMgQPZXhjaGFuZ2VkQW1vdW50CQEOZXhjaGFuZ2VLZWVwZXIKBQl0b2tlblRvSWQFEGFtb3VudFRvRXhjaGFuZ2UFDGNsYWltZWRBc3NldAUJYW1vdW50c0luBQlhZGRyZXNzZXMFD2Fzc2V0c1RvUmVjZWl2ZQULZXN0UmVjZWl2ZWQFEXNsaXBwYWdlVG9sZXJhbmNlBQttaW5SZWNlaXZlZAUHb3B0aW9ucwQJbmV3Q2hhbmdlCQBlAgkAZAIFDWNsYWltZWRBbW91bnQFBmNoYW5nZQUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBnAgUJbmV3Q2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UFCW5ld0NoYW5nZQUDbmlsCQACAQIPTmVnYXRpdmUgY2hhbmdlCQDOCAIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQFpARJjYXBpdGFsaXplRXhQdXp6bGUHBHBvb2wJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0Jcm91dGVzU3RyDG1pblRvUmVjZWl2ZQdvcHRpb25zCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQNJHQwNDg2Mjg0ODcyNwkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UEDWNsYWltZWRBbW91bnQIBQ0kdDA0ODYyODQ4NzI3Al8xBAxjbGFpbWVkQXNzZXQIBQ0kdDA0ODYyODQ4NzI3Al8yBA9leGNoYW5nZWRBbW91bnQJAQ5leGNoYW5nZVB1enpsZQYFCXRva2VuVG9JZAUQYW1vdW50VG9FeGNoYW5nZQUMY2xhaW1lZEFzc2V0BQlyb3V0ZXNTdHIFDG1pblRvUmVjZWl2ZQUHb3B0aW9ucwQJbmV3Q2hhbmdlCQBlAgkAZAIFDWNsYWltZWRBbW91bnQFBmNoYW5nZQUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBnAgUJbmV3Q2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UFCW5ld0NoYW5nZQUDbmlsBQNuaWwJAM4IAgkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFC2NoYW5nZUVudHJ5AWkBEmNhcGl0YWxpemVFeFN3b3BGaQsEcG9vbAl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQpleGNoYW5nZXJzDmV4Y2hhbmdlcnNUeXBlBWFyZ3MxBWFyZ3MyEXJvdXRpbmdBc3NldHNLZXlzEm1pbkFtb3VudFRvUmVjZWl2ZQdvcHRpb25zCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQNJHQwNDk1NzI0OTY3MQkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UEDWNsYWltZWRBbW91bnQIBQ0kdDA0OTU3MjQ5NjcxAl8xBAxjbGFpbWVkQXNzZXQIBQ0kdDA0OTU3MjQ5NjcxAl8yBA9leGNoYW5nZWRBbW91bnQJAQ5leGNoYW5nZVN3b3BGaQoFCXRva2VuVG9JZAUQYW1vdW50VG9FeGNoYW5nZQUMY2xhaW1lZEFzc2V0BQpleGNoYW5nZXJzBQ5leGNoYW5nZXJzVHlwZQUFYXJnczEFBWFyZ3MyBRFyb3V0aW5nQXNzZXRzS2V5cwUSbWluQW1vdW50VG9SZWNlaXZlBQdvcHRpb25zBAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwFA25pbAkAzggCCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBXBUeXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAULY2hhbmdlRW50cnkBaQEOY2FwaXRhbGl6ZU5vRXgDBHBvb2wFY2xhaW0RYW1vdW50RnJvbUJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBA0kdDA1MDI2ODUwMzYzCQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEWFtb3VudEZyb21CYWxhbmNlAAAEDWNsYWltZWRBbW91bnQIBQ0kdDA1MDI2ODUwMzYzAl8xBAxjbGFpbWVkQXNzZXQIBQ0kdDA1MDI2ODUwMzYzAl8yCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBXBUeXBlCQEMYXNzZXRJZFRvU3RyAQUMY2xhaW1lZEFzc2V0CQBkAgUNY2xhaW1lZEFtb3VudAURYW1vdW50RnJvbUJhbGFuY2UBaQELaW5pdE5ld1Bvb2wJBHR5cGUIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCWNhbkJvcnJvdwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMDCQECIT0CBQR0eXBlBQdTRl9QT09MCQECIT0CBQR0eXBlBQdXWF9QT09MBwkAAgECCldyb25nIHR5cGUEDSR0MDUwNzg5NTA4ODMJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQhwb29sQWRkcgUEdHlwZQQDYUlkCAUNJHQwNTA3ODk1MDg4MwJfMQQDYklkCAUNJHQwNTA3ODk1MDg4MwJfMgQEYUJhbAgFDSR0MDUwNzg5NTA4ODMCXzMEBGJCYWwIBQ0kdDA1MDc4OTUwODgzAl80BAdzaGFyZUlkCAUNJHQwNTA3ODk1MDg4MwJfNQMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa1Bvb2xJbnRlcmVzdExvYW4AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAUIcG9vbEFkZHIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUIcG9vbEFkZHIFDmtQb29sQ2FuQm9ycm93BQljYW5Cb3Jyb3cFA25pbAFpAQ51cGRhdGVQb29sRmVlcwcIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQhwb29sQWRkcgkAAgEJAKwCAgIaQ2FuJ3QgZmluZCBwb29sIHdpdGggYWRkciAFCHBvb2xBZGRyAwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECE2RBcHAgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGBQNuaWwBaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQIVZEFwcCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwUDbmlsAWkBEGFjdGl2YXRlRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIdZEFwcCBhbHJlYWR5IGFjdGl2ZSBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwYFA25pbAFpARBzaHV0ZG93bkZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIfZEFwcCBhbHJlYWR5IHNodXRkb3duIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBwUDbmlsAWkBCmFjdGl2YXRlU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECFVNXT1BGSSBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93blNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECF1NXT1BGSSBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBCmFjdGl2YXRlV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECEVdYIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQITV1ggYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQxhY3RpdmF0ZVBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQITUG9vbCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYFA25pbAFpAQxzaHV0ZG93blBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhVQb29sIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUHBQNuaWwBAnR4AQZ2ZXJpZnkABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDBQppc1JpZ2h0RmVlBQppc0luaXRDYWxsBwUGaXNTZWxmBwUMaXNub1BheW1lbnRzBwQMZ3JvdXAxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUOZ3JvdXAxQWRtaW4xUEsAAQkAZAIAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDmdyb3VwMUFkbWluMlBLAAEAAAQMZ3JvdXAyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUOZ3JvdXAyQWRtaW4xUEsAAQkAZAIAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDmdyb3VwMkFkbWluMlBLAAEAAAkAAAIJAGQCBQxncm91cDFTaWduZWQFDGdyb3VwMlNpZ25lZAACkrsOuA==", "height": 2703051, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 665Db2eQhQvRHQhStSAHCRQVBctB7pBK5LK8AgM225Gv Next: none Diff:
OldNewDifferences
359359
360360 func getAssetsPrice (assetIds) = {
361361 func getPrices (a,assetId) = {
362- let assetPrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
362+ let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
363363 (a :+ assetPrice)
364364 }
365365
382382 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
383383 let poolAddr = Address(fromBase58String(pool))
384384 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
385- let $t01168211747 = getPoolData(poolAddr, pType)
386- let aId = $t01168211747._1
387- let bId = $t01168211747._2
388- let aBalance = $t01168211747._3
389- let bBalance = $t01168211747._4
390- let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
391- let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
392- let shareSupply = getShareSupply(poolAddr, pType, shareId)
393- let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
394- let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
395- let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
396- let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
397- fraction(sum, sharePrecision, shareSupply)
385+ let $t01169311758 = getPoolData(poolAddr, pType)
386+ let aId = $t01169311758._1
387+ let bId = $t01169311758._2
388+ let aBalance = $t01169311758._3
389+ let bBalance = $t01169311758._4
390+ let dPriceA = valueOrElse(getInteger(priceOracleAddr, (aId + kPriceInOracle)), -1)
391+ let dPriceB = valueOrElse(getInteger(priceOracleAddr, (bId + kPriceInOracle)), -1)
392+ if (if ((0 > dPriceA))
393+ then true
394+ else (0 > dPriceB))
395+ then -1
396+ else {
397+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
398+ let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
399+ let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
400+ let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
401+ let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
402+ fraction(sum, sharePrecision, shareSupply)
403+ }
398404 }
399405
400406
458464 }
459465 else if ((pType == WX_POOL))
460466 then {
461- let $t01329213542 = $Tuple2(split({
467+ let $t01337013620 = $Tuple2(split({
462468 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
463469 if ($isInstanceOf(@, "String"))
464470 then @
469475 then @
470476 else throw(($getType(@) + " couldn't be cast to String"))
471477 }, "__"))
472- if (($t01329213542 == $t01329213542))
478+ if (($t01337013620 == $t01337013620))
473479 then {
474- let evalPutInB = $t01329213542._2
475- let evalPutInA = $t01329213542._1
480+ let evalPutInB = $t01337013620._2
481+ let evalPutInA = $t01337013620._1
476482 let lpInA = parseIntValue(evalPutInA[1])
477483 let lpInB = parseIntValue(evalPutInB[1])
478484 if ((lpInB > lpInA))
521527
522528
523529 func unstakeLP (pool,pType,shareId,amount) = {
524- let $t01520115551 = if ((pType == SF_POOL))
530+ let $t01527915629 = if ((pType == SF_POOL))
525531 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
526532 else if ((pType == WX_POOL))
527533 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
528534 else unknownPoolType()
529- let farmAddr = $t01520115551._1
530- let fName = $t01520115551._2
531- let params = $t01520115551._3
535+ let farmAddr = $t01527915629._1
536+ let fName = $t01527915629._2
537+ let params = $t01527915629._3
532538 let inv = invoke(farmAddr, fName, params, nil)
533539 if ((inv == inv))
534540 then amount
541547 let feeScale6 = 1000000
542548 let fee = getIntegerValue(poolAddr, kSFPoolFee)
543549 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
544- let $t01597316279 = if ((assetTokenToGet == assetIdA))
550+ let $t01605116357 = if ((assetTokenToGet == assetIdA))
545551 then {
546552 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
547553 $Tuple2(amountToPay, assetIdB)
550556 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
551557 $Tuple2(amountToPay, assetIdA)
552558 }
553- let amountToPay = $t01597316279._1
554- let assetToPay = $t01597316279._2
559+ let amountToPay = $t01605116357._1
560+ let assetToPay = $t01605116357._2
555561 $Tuple2(assetToPay, amountToPay)
556562 }
557563
571577
572578
573579 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
574- let $t01701917058 = getWXSwapFees(pool)
575- let pFee = $t01701917058._1
576- let prFee = $t01701917058._2
580+ let $t01709717136 = getWXSwapFees(pool)
581+ let pFee = $t01709717136._1
582+ let prFee = $t01709717136._2
577583 let feeScale = toBigInt(100000000)
578- let $t01709817406 = if ((assetTokenToGet == assetIdA))
584+ let $t01717617484 = if ((assetTokenToGet == assetIdA))
579585 then {
580586 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
581587 $Tuple2(amountToPay, assetIdB)
584590 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
585591 $Tuple2(amountToPay, assetIdA)
586592 }
587- let amountToPay = $t01709817406._1
588- let assetToPay = $t01709817406._2
593+ let amountToPay = $t01717617484._1
594+ let assetToPay = $t01717617484._2
589595 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
590596 $Tuple2(assetToPay, amountToPayWithFee)
591597 }
593599
594600 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((pType == SF_POOL))
595601 then {
596- let $t01775317875 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
597- let assetToPay = $t01775317875._1
598- let amountToPay = $t01775317875._2
602+ let $t01783117953 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
603+ let assetToPay = $t01783117953._1
604+ let amountToPay = $t01783117953._2
599605 invoke(addressFromStringValue(pool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
600606 }
601607 else if ((pType == WX_POOL))
602608 then {
603- let $t01807518197 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604- let assetToPay = $t01807518197._1
605- let amountToPay = $t01807518197._2
609+ let $t01815318275 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
610+ let assetToPay = $t01815318275._1
611+ let amountToPay = $t01815318275._2
606612 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
607613 }
608614 else unknownPoolType()
609615
610616
611617 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
612- let $t01848418948 = if ((pType == SF_POOL))
618+ let $t01856219026 = if ((pType == SF_POOL))
613619 then {
614620 let inv = {
615621 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
644650 else throw("Strict value is not equal to itself.")
645651 }
646652 else unknownPoolType()
647- let amountA = $t01848418948._1
648- let amountB = $t01848418948._2
653+ let amountA = $t01856219026._1
654+ let amountB = $t01856219026._2
649655 $Tuple2(amountA, amountB)
650656 }
651657
667673 }
668674 else if ((pType == WX_POOL))
669675 then {
670- let $t01931619395 = getWXPoolData(addressFromStringValue(pool))
671- let aId = $t01931619395._1
672- let bId = $t01931619395._2
673- let aBal = $t01931619395._3
674- let bBal = $t01931619395._4
675- let lpId = $t01931619395._5
676+ let $t01939419473 = getWXPoolData(addressFromStringValue(pool))
677+ let aId = $t01939419473._1
678+ let bId = $t01939419473._2
679+ let aBal = $t01939419473._3
680+ let bBal = $t01939419473._4
681+ let lpId = $t01939419473._5
676682 let balBefore = accountBalance(WXID)
677683 if ((balBefore == balBefore))
678684 then {
694700 if ((lpBalanceBefore == lpBalanceBefore))
695701 then {
696702 let poolAddr = addressFromStringValue(pool)
697- let $t01999320409 = if (if ((pmtA > 0))
703+ let $t02007120487 = if (if ((pmtA > 0))
698704 then (pmtB > 0)
699705 else false)
700706 then {
701- let $t02005920175 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
702- let pmtInA = $t02005920175._1
703- let pmtInB = $t02005920175._2
704- let change = $t02005920175._3
705- let changeId = $t02005920175._4
707+ let $t02013720253 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
708+ let pmtInA = $t02013720253._1
709+ let pmtInB = $t02013720253._2
710+ let change = $t02013720253._3
711+ let changeId = $t02013720253._4
706712 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
707713 if ((inv == inv))
708714 then $Tuple2(change, changeId)
713719 else if ((pmtB > 0))
714720 then $Tuple2(pmtB, bId)
715721 else throw("pmts must be > 0")
716- let change = $t01999320409._1
717- let changeId = $t01999320409._2
722+ let change = $t02007120487._1
723+ let changeId = $t02007120487._2
718724 let inv = if ((change > 0))
719725 then replenishOneTokenByType(poolAddr, pType, change, changeId)
720726 else nil
742748 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
743749 let totalAmount = getPoolTotalShare(pool)
744750 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
745- let $t02126621504 = if (withLoan)
751+ let $t02134421582 = if (withLoan)
746752 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
747753 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
748- let curPoolInterest = $t02126621504._1
749- let totalStakedWithLoan = $t02126621504._2
754+ let curPoolInterest = $t02134421582._1
755+ let totalStakedWithLoan = $t02134421582._2
750756 [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))]
751757 }
752758
792798
793799 func capitalize (pool,pType,tokenId,tokenAmount) = {
794800 let poolAddr = Address(fromBase58String(pool))
795- let $t02385823924 = getPoolData(poolAddr, pType)
796- let AId = $t02385823924._1
797- let BId = $t02385823924._2
798- let balA = $t02385823924._3
799- let balB = $t02385823924._4
800- let shareId = $t02385823924._5
801+ let $t02393624002 = getPoolData(poolAddr, pType)
802+ let AId = $t02393624002._1
803+ let BId = $t02393624002._2
804+ let balA = $t02393624002._3
805+ let balB = $t02393624002._4
806+ let shareId = $t02393624002._5
801807 if (if ((tokenId != AId))
802808 then (tokenId != BId)
803809 else false)
811817 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
812818 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
813819 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
814- let $t02456424664 = if ((tokenId == AId))
820+ let $t02464224742 = if ((tokenId == AId))
815821 then $Tuple2((tokenAmount - axlyFee), 0)
816822 else $Tuple2(0, (tokenAmount - axlyFee))
817- let pmtA = $t02456424664._1
818- let pmtB = $t02456424664._2
819- let $t02466724771 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
820- let stakedAmount = $t02466724771._1
821- let nf = $t02466724771._2
823+ let pmtA = $t02464224742._1
824+ let pmtB = $t02464224742._2
825+ let $t02474524849 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
826+ let stakedAmount = $t02474524849._1
827+ let nf = $t02474524849._2
822828 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
823829 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
824830 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
863869 let userAddr = Address(fromBase58String(user))
864870 let poolAddr = Address(fromBase58String(pool))
865871 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
866- let $t02730227374 = getPoolData(poolAddr, pType)
867- let idAStr = $t02730227374._1
868- let idBStr = $t02730227374._2
869- let balA = $t02730227374._3
870- let balB = $t02730227374._4
871- let shareId = $t02730227374._5
872- let $t02737727444 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
873- let idA = $t02737727444._1
874- let idB = $t02737727444._2
872+ let $t02738027452 = getPoolData(poolAddr, pType)
873+ let idAStr = $t02738027452._1
874+ let idBStr = $t02738027452._2
875+ let balA = $t02738027452._3
876+ let balB = $t02738027452._4
877+ let shareId = $t02738027452._5
878+ let $t02745527522 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
879+ let idA = $t02745527522._1
880+ let idB = $t02745527522._2
875881 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
876882 let cBalABefore = accountBalance(idA)
877883 if ((cBalABefore == cBalABefore))
902908 let cBalBAfter = accountBalance(idB)
903909 if ((cBalBAfter == cBalBAfter))
904910 then {
905- let $t02813928228 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
906- let tokensAmountA = $t02813928228._1
907- let tokensAmountB = $t02813928228._2
908- let $t02823129467 = if (isBorrowed)
911+ let $t02821728306 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
912+ let tokensAmountA = $t02821728306._1
913+ let tokensAmountB = $t02821728306._2
914+ let $t02830929545 = if (isBorrowed)
909915 then {
910916 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
911917 let debt = {
954960 else throw("Strict value is not equal to itself.")
955961 }
956962 else $Tuple2(tokensAmountA, tokensAmountB)
957- let toUserA = $t02823129467._1
958- let toUserB = $t02823129467._2
963+ let toUserA = $t02830929545._1
964+ let toUserB = $t02830929545._2
959965 let poolTotalLoanEntries = if (isBorrowed)
960966 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
961967 else nil
10011007 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10021008 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10031009 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1004- let $t03144931546 = if ((borrowId == aId))
1010+ let $t03152731624 = if ((borrowId == aId))
10051011 then $Tuple2(dPriceA, decPrA)
10061012 else $Tuple2(dPriceB, decPrB)
1007- let borrowPrice = $t03144931546._1
1008- let borrowDecPr = $t03144931546._2
1013+ let borrowPrice = $t03152731624._1
1014+ let borrowDecPr = $t03152731624._2
10091015 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10101016 }
10111017
10341040
10351041
10361042 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1037- let $t03254632805 = if (claim)
1043+ let $t03262432883 = if (claim)
10381044 then claimFarmed(pType, pool)
10391045 else {
10401046 let claimedAsset = if ((pType == SF_POOL))
10441050 else unknownPoolType()
10451051 $Tuple2(amount, claimedAsset)
10461052 }
1047- let claimAmount = $t03254632805._1
1048- let claimAsset = $t03254632805._2
1053+ let claimAmount = $t03262432883._1
1054+ let claimAsset = $t03262432883._2
10491055 let bal = accountBalance(claimAsset)
10501056 if (if ((amount > (claimAmount + change)))
10511057 then true
10531059 then throw("To big amount to exchange")
10541060 else $Tuple2(claimAmount, claimAsset)
10551061 }
1062+
1063+
1064+@Callable(i)
1065+func getPoolInfoREADONLY (pool) = {
1066+ let poolAddr = addressFromStringValue(pool)
1067+ let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1068+ let $t03328033370 = getPoolData(Address(fromBase58String(pool)), pType)
1069+ let AId = $t03328033370._1
1070+ let BId = $t03328033370._2
1071+ let balA = $t03328033370._3
1072+ let balB = $t03328033370._4
1073+ let shareId = $t03328033370._5
1074+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
1075+ $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
1076+ }
1077+
10561078
10571079
10581080 @Callable(i)
10761098 @Callable(i)
10771099 func getUserPositionREADONLY (user,pools,posNum) = {
10781100 func userPos (a,pool) = {
1079- let $t03376733837 = a
1080- let wAmountsA = $t03376733837._1
1081- let wAmountsB = $t03376733837._2
1082- let debts = $t03376733837._3
1083- let eqWAmountsA = $t03376733837._4
1084- let eqWAmountsB = $t03376733837._5
1085- let index = $t03376733837._6
1101+ let $t03424334313 = a
1102+ let wAmountsA = $t03424334313._1
1103+ let wAmountsB = $t03424334313._2
1104+ let debts = $t03424334313._3
1105+ let eqWAmountsA = $t03424334313._4
1106+ let eqWAmountsB = $t03424334313._5
1107+ let index = $t03424334313._6
10861108 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
10871109 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
10881110 else {
10891111 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1090- let $t03411634206 = getPoolData(Address(fromBase58String(pool)), pType)
1091- let AId = $t03411634206._1
1092- let BId = $t03411634206._2
1093- let balA = $t03411634206._3
1094- let balB = $t03411634206._4
1095- let shareId = $t03411634206._5
1112+ let $t03459234682 = getPoolData(Address(fromBase58String(pool)), pType)
1113+ let AId = $t03459234682._1
1114+ let BId = $t03459234682._2
1115+ let balA = $t03459234682._3
1116+ let balB = $t03459234682._4
1117+ let shareId = $t03459234682._5
10961118 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
10971119 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1098- let $t03442234542 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1099- let wAmountA = $t03442234542._1
1100- let wAmountB = $t03442234542._2
1120+ let $t03489835018 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1121+ let wAmountA = $t03489835018._1
1122+ let wAmountB = $t03489835018._2
11011123 if ((borrowAmount > 0))
11021124 then {
11031125 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11311153 }
11321154 else unknownPoolType()
11331155 else 0
1134- let $t03545435673 = if ((borrowAsset == AId))
1156+ let $t03593036149 = if ((borrowAsset == AId))
11351157 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
11361158 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1137- let eqWAmountA = $t03545435673._1
1138- let eqWAmountB = $t03545435673._2
1159+ let eqWAmountA = $t03593036149._1
1160+ let eqWAmountB = $t03593036149._2
11391161 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
11401162 }
11411163 else throw("Strict value is not equal to itself.")
11441166 }
11451167 }
11461168
1147- let $t03592836039 = {
1169+ let $t03640436515 = {
11481170 let $l = pools
11491171 let $s = size($l)
11501172 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
11581180
11591181 $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)
11601182 }
1161- let wAmountsA = $t03592836039._1
1162- let wAmountsB = $t03592836039._2
1163- let debts = $t03592836039._3
1164- let eqWAmountsA = $t03592836039._4
1165- let eqWAmountsB = $t03592836039._5
1183+ let wAmountsA = $t03640436515._1
1184+ let wAmountsB = $t03640436515._2
1185+ let debts = $t03640436515._3
1186+ let eqWAmountsA = $t03640436515._4
1187+ let eqWAmountsB = $t03640436515._5
11661188 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
11671189 }
11681190
11821204 else false)
11831205 then throw("You can't borrow in this pool")
11841206 else {
1185- let $t03663736727 = getPoolData(Address(fromBase58String(pool)), pType)
1186- let AId = $t03663736727._1
1187- let BId = $t03663736727._2
1188- let balA = $t03663736727._3
1189- let balB = $t03663736727._4
1190- let shareId = $t03663736727._5
1207+ let $t03711337203 = getPoolData(Address(fromBase58String(pool)), pType)
1208+ let AId = $t03711337203._1
1209+ let BId = $t03711337203._2
1210+ let balA = $t03711337203._3
1211+ let balB = $t03711337203._4
1212+ let shareId = $t03711337203._5
11911213 if (if ((borrowId != AId))
11921214 then (borrowId != BId)
11931215 else false)
11941216 then throw("Wrong borrow asset")
11951217 else {
1196- let $t03680836867 = parseReplenishPmts(i.payments, AId, BId)
1197- let pmtA = $t03680836867._1
1198- let pmtB = $t03680836867._2
1218+ let $t03728437343 = parseReplenishPmts(i.payments, AId, BId)
1219+ let pmtA = $t03728437343._1
1220+ let pmtB = $t03728437343._2
11991221 let user = toString(i.caller)
12001222 let newPosNum = getNewUserPositionNumber(user)
12011223 if ((leverage > 100))
12151237 if ((inv == inv))
12161238 then {
12171239 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1218- let $t03785637950 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1219- if (($t03785637950 == $t03785637950))
1240+ let $t03833238426 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1241+ if (($t03833238426 == $t03833238426))
12201242 then {
1221- let newBalB = $t03785637950._2
1222- let newBalA = $t03785637950._1
1243+ let newBalB = $t03833238426._2
1244+ let newBalA = $t03833238426._1
12231245 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1224- let $t03802038135 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1225- let wAmountA = $t03802038135._1
1226- let wAmountB = $t03802038135._2
1246+ let $t03849638611 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1247+ let wAmountA = $t03849638611._1
1248+ let wAmountB = $t03849638611._2
12271249 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
12281250 }
12291251 else throw("Strict value is not equal to itself.")
12331255 else throw("Strict value is not equal to itself.")
12341256 }
12351257 else {
1236- let $t03818838303 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1237- if (($t03818838303 == $t03818838303))
1258+ let $t03866438779 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1259+ if (($t03866438779 == $t03866438779))
12381260 then {
1239- let axlyFee = $t03818838303._2
1240- let userStaked = $t03818838303._1
1241- let $t03830938403 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1242- if (($t03830938403 == $t03830938403))
1261+ let axlyFee = $t03866438779._2
1262+ let userStaked = $t03866438779._1
1263+ let $t03878538879 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1264+ if (($t03878538879 == $t03878538879))
12431265 then {
1244- let newBalB = $t03830938403._2
1245- let newBalA = $t03830938403._1
1266+ let newBalB = $t03878538879._2
1267+ let newBalA = $t03878538879._1
12461268 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1247- let $t03847338588 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1248- let wAmountA = $t03847338588._1
1249- let wAmountB = $t03847338588._2
1269+ let $t03894939064 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1270+ let wAmountA = $t03894939064._1
1271+ let wAmountB = $t03894939064._2
12501272 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
12511273 }
12521274 else throw("Strict value is not equal to itself.")
13391361
13401362 @Callable(i)
13411363 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1342- let $t04342743531 = parseRequest(requestId)
1343- let user = $t04342743531._1
1344- let pool = $t04342743531._2
1345- let pmtA = $t04342743531._3
1346- let AId = $t04342743531._4
1347- let pmtB = $t04342743531._5
1348- let BId = $t04342743531._6
1349- let balA = $t04342743531._7
1350- let balB = $t04342743531._8
1351- let shareId = $t04342743531._9
1352- let bwAsset = $t04342743531._10
1353- let bwAmount = $t04342743531._11
1364+ let $t04390344007 = parseRequest(requestId)
1365+ let user = $t04390344007._1
1366+ let pool = $t04390344007._2
1367+ let pmtA = $t04390344007._3
1368+ let AId = $t04390344007._4
1369+ let pmtB = $t04390344007._5
1370+ let BId = $t04390344007._6
1371+ let balA = $t04390344007._7
1372+ let balB = $t04390344007._8
1373+ let shareId = $t04390344007._9
1374+ let bwAsset = $t04390344007._10
1375+ let bwAmount = $t04390344007._11
13541376 if ((size(i.payments) != 1))
13551377 then throw("Wrong payment size")
13561378 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
13581380 else (i.payments[0].amount != bwAmount))
13591381 then throw("Wrong payment")
13601382 else {
1361- let $t04372143821 = if ((AId == bwAsset))
1383+ let $t04419744297 = if ((AId == bwAsset))
13621384 then $Tuple2((pmtA + bwAmount), pmtB)
13631385 else $Tuple2(pmtA, (pmtB + bwAmount))
1364- let pmtAllA = $t04372143821._1
1365- let pmtAllB = $t04372143821._2
1386+ let pmtAllA = $t04419744297._1
1387+ let pmtAllB = $t04419744297._2
13661388 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1367- let $t04390344018 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1368- let userStaked = $t04390344018._1
1369- let axlyFee = $t04390344018._2
1389+ let $t04437944494 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1390+ let userStaked = $t04437944494._1
1391+ let axlyFee = $t04437944494._2
13701392 let posNum = getNewUserPositionNumber(user)
13711393 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
13721394 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1373- let $t04437844493 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1374- let wAmountA = $t04437844493._1
1375- let wAmountB = $t04437844493._2
1395+ let $t04485444969 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1396+ let wAmountA = $t04485444969._1
1397+ let wAmountB = $t04485444969._2
13761398 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
13771399 }
13781400 }))
13831405 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
13841406 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13851407 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1386- let $t04501445104 = getPoolData(Address(fromBase58String(pool)), pType)
1387- let AId = $t04501445104._1
1388- let BId = $t04501445104._2
1389- let balA = $t04501445104._3
1390- let balB = $t04501445104._4
1391- let shareId = $t04501445104._5
1408+ let $t04549045580 = getPoolData(Address(fromBase58String(pool)), pType)
1409+ let AId = $t04549045580._1
1410+ let BId = $t04549045580._2
1411+ let balA = $t04549045580._3
1412+ let balB = $t04549045580._4
1413+ let shareId = $t04549045580._5
13921414 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
13931415 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
13941416 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
14201442 func capitalizeExKeeper (pool,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14211443 let pType = getStringValue(this, (kPool + pool))
14221444 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1423- let $t04725347352 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1424- let claimedAmount = $t04725347352._1
1425- let claimedAsset = $t04725347352._2
1445+ let $t04772947828 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1446+ let claimedAmount = $t04772947828._1
1447+ let claimedAsset = $t04772947828._2
14261448 let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
14271449 let newChange = ((claimedAmount + change) - amountToExchange)
14281450 let changeEntry = if ((newChange >= 0))
14371459 func capitalizeExPuzzle (pool,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14381460 let pType = getStringValue(this, (kPool + pool))
14391461 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1440- let $t04815248251 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1441- let claimedAmount = $t04815248251._1
1442- let claimedAsset = $t04815248251._2
1462+ let $t04862848727 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1463+ let claimedAmount = $t04862848727._1
1464+ let claimedAsset = $t04862848727._2
14431465 let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
14441466 let newChange = ((claimedAmount + change) - amountToExchange)
14451467 let changeEntry = if ((newChange >= 0))
14541476 func capitalizeExSwopFi (pool,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14551477 let pType = getStringValue(this, (kPool + pool))
14561478 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1457- let $t04909649195 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1458- let claimedAmount = $t04909649195._1
1459- let claimedAsset = $t04909649195._2
1479+ let $t04957249671 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1480+ let claimedAmount = $t04957249671._1
1481+ let claimedAsset = $t04957249671._2
14601482 let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
14611483 let newChange = ((claimedAmount + change) - amountToExchange)
14621484 let changeEntry = if ((newChange >= 0))
14701492 @Callable(i)
14711493 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14721494 let pType = getStringValue(this, (kPool + pool))
1473- let $t04979249887 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1474- let claimedAmount = $t04979249887._1
1475- let claimedAsset = $t04979249887._2
1495+ let $t05026850363 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1496+ let claimedAmount = $t05026850363._1
1497+ let claimedAsset = $t05026850363._2
14761498 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
14771499 }))
14781500
14841506 else false)
14851507 then throw("Wrong type")
14861508 else {
1487- let $t05031350407 = getPoolData(Address(fromBase58String(poolAddr)), type)
1488- let aId = $t05031350407._1
1489- let bId = $t05031350407._2
1490- let aBal = $t05031350407._3
1491- let bBal = $t05031350407._4
1492- let shareId = $t05031350407._5
1509+ let $t05078950883 = getPoolData(Address(fromBase58String(poolAddr)), type)
1510+ let aId = $t05078950883._1
1511+ let bId = $t05078950883._2
1512+ let aBal = $t05078950883._3
1513+ let bBal = $t05078950883._4
1514+ let shareId = $t05078950883._5
14931515 if ((0 > inFeeNoLoan))
14941516 then throw("inFeeNoLoan must be greater than 0")
14951517 else if ((0 > inFeeLoan))
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"
77
88 let CAP_FEE_NO_LOAN = "capNoLoan"
99
1010 let CAP_FEE_LOAN = "capLoan"
1111
1212 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1313
1414 let STOPLOSS_LOAN = "stopLossLoan"
1515
1616 let LOAN_FEE = "loan"
1717
1818 let NO_LOAN_FEE = "noLoan"
1919
2020 let NO_FEE = "noFee"
2121
2222 let SCALE8 = 100000000
2323
2424 let SCALE10 = 10000000000
2525
2626 let SCALE16 = toBigInt(10000000000000000)
2727
2828 let FEE_SCALE6 = 1000000
2929
3030 let kSFPoolAAssetBalance = "A_asset_balance"
3131
3232 let kSFPoolBAssetBalance = "B_asset_balance"
3333
3434 let kSFPoolAAssetId = "A_asset_id"
3535
3636 let kSFPoolBAssetId = "B_asset_id"
3737
3838 let kSFPoolShareId = "share_asset_id"
3939
4040 let kSFPoolShareSupply = "share_asset_supply"
4141
4242 let kSFPoolFee = "commission"
4343
4444 let kUserPosition = "_userPosition"
4545
4646 let kUserPositionPool = "_userPositionPool"
4747
4848 let kUserBorrowAmount = "_userPositionBorrowAmount"
4949
5050 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5151
5252 let kUserPositionNum = "_userPositionNumber"
5353
5454 let kUserPositionInterest = "_userPositionInterest"
5555
5656 let kPoolTotal = "_poolTotal"
5757
5858 let kPoolTotalLoan = "_poolTotalLoan"
5959
6060 let kPoolInterestLoan = "_poolInterestLoan"
6161
6262 let kPoolInterestNoLoan = "_poolInterestNoLoan"
6363
6464 let kPoolCanBorrow = "_poolCanBorrow"
6565
6666 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
6767
6868 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
6969
7070 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7171
7272 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7373
7474 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7575
7676 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
7777
7878 let kRequestId = "_request_id"
7979
8080 let kRequestIter = "requests_iter"
8181
8282 let kPool = "pool_"
8383
8484 let kSharePool = "_poolShareId"
8585
8686 let kPoolCapChange = "_poolCapChange"
8787
8888 let kTokenLastPrice = "last_price"
8989
9090 let kPriceInOracle = "_twap5B"
9191
9292 let kActive = "active"
9393
9494 let kActiveUsers = "activeUsers"
9595
9696 let kActiveSFWX = "_active"
9797
9898 let kPoolActive = "_activePool"
9999
100100 let kUserStopLoss = "_stopLoss"
101101
102102 let kMoneyBox = "axly_money_box"
103103
104104 let kSFFarmingAddr = "swopfi_farming_addr"
105105
106106 let kLendService = "lend_service_addr"
107107
108108 let kOperatorCallPK = "admin_call_pub_key"
109109
110110 let kPriceOracle = "price_oracle"
111111
112112 let kExContract = "exchange_contract"
113113
114114 let kWxSwapContract = "wx_swap_contract"
115115
116116 let kSwopId = "swop_id"
117117
118118 let kWxId = "wx_id"
119119
120120 let kGroup1Admin1PK = "group1_admin1_pub_key"
121121
122122 let kGroup1Admin2PK = "group1_admin2_pub_key"
123123
124124 let kGroup2Admin1PK = "group2_admin1_pub_key"
125125
126126 let kGroup2Admin2PK = "group2_admin2_pub_key"
127127
128128 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
129129
130130 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
131131
132132 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
133133
134134 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
135135
136136 let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
137137
138138 let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
139139
140140 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
141141
142142 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
143143
144144 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
145145
146146 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
147147
148148 let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
149149
150150 func unknownPoolType () = throw("Wrong pool type")
151151
152152
153153 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
154154
155155
156156 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
157157 then unit
158158 else throw("Only operator can call this function")
159159
160160
161161 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
162162 then true
163163 else (i.callerPublicKey == group1Admin2PK))
164164 then unit
165165 else throw("Only admin group1 can call this function")
166166
167167
168168 func isSelfCall (i) = if ((i.caller == this))
169169 then unit
170170 else throw("Only contract itself can call this function")
171171
172172
173173 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
174174 then unit
175175 else throw("Only land contract can call this function")
176176
177177
178178 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
179179 then unit
180180 else throw("DApp is inactive at this moment")
181181
182182
183183 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
184184 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
185185 else false)
186186 then unit
187187 else throw("DApp is inactive for users at this moment")
188188
189189
190190 func isPoolActive (pool,type) = {
191191 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
192192 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
193193 if (if (WXSFActive)
194194 then poolActive
195195 else false)
196196 then true
197197 else false
198198 }
199199
200200
201201 func accountBalance (assetId) = match assetId {
202202 case id: ByteVector =>
203203 assetBalance(this, id)
204204 case waves: Unit =>
205205 wavesBalance(this).available
206206 case _ =>
207207 throw("Match error")
208208 }
209209
210210
211211 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"))
212212
213213
214214 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
215215 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
216216 if ($isInstanceOf(@, "Int"))
217217 then @
218218 else throw(($getType(@) + " couldn't be cast to Int"))
219219 }, {
220220 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
221221 if ($isInstanceOf(@, "Int"))
222222 then @
223223 else throw(($getType(@) + " couldn't be cast to Int"))
224224 })
225225
226226
227227 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
228228 then getSFPoolBalances(poolAddr)
229229 else if ((type == WX_POOL))
230230 then getWXPoolBalances(poolAddr, aId, bId)
231231 else unknownPoolType()
232232
233233
234234 func getSFPoolData (poolAddr) = {
235235 let $t078997948 = getSFPoolBalances(poolAddr)
236236 if (($t078997948 == $t078997948))
237237 then {
238238 let balB = $t078997948._2
239239 let balA = $t078997948._1
240240 $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"))
241241 }
242242 else throw("Strict value is not equal to itself.")
243243 }
244244
245245
246246 func getWXPoolData (poolAddr) = {
247247 let cfg = {
248248 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
249249 if ($isInstanceOf(@, "List[Any]"))
250250 then @
251251 else throw(($getType(@) + " couldn't be cast to List[Any]"))
252252 }
253253 if ((cfg == cfg))
254254 then {
255255 let aId = valueOrErrorMessage({
256256 let @ = cfg[4]
257257 if ($isInstanceOf(@, "String"))
258258 then @
259259 else unit
260260 }, "Can't get pool A asset id")
261261 let bId = valueOrErrorMessage({
262262 let @ = cfg[5]
263263 if ($isInstanceOf(@, "String"))
264264 then @
265265 else unit
266266 }, "Can't get pool B asset id")
267267 let shareId = valueOrErrorMessage({
268268 let @ = cfg[3]
269269 if ($isInstanceOf(@, "String"))
270270 then @
271271 else unit
272272 }, "Can't get pool LP asset id")
273273 let $t086458704 = getWXPoolBalances(poolAddr, aId, bId)
274274 if (($t086458704 == $t086458704))
275275 then {
276276 let balB = $t086458704._2
277277 let balA = $t086458704._1
278278 $Tuple5(aId, bId, balA, balB, shareId)
279279 }
280280 else throw("Strict value is not equal to itself.")
281281 }
282282 else throw("Strict value is not equal to itself.")
283283 }
284284
285285
286286 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
287287 then getSFPoolData(poolAddr)
288288 else if ((type == WX_POOL))
289289 then getWXPoolData(poolAddr)
290290 else unknownPoolType()
291291
292292
293293 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
294294 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
295295 else if ((type == WX_POOL))
296296 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
297297 else unknownPoolType()
298298
299299
300300 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
301301
302302
303303 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
304304
305305
306306 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
307307
308308
309309 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
310310 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
311311 else if ((feeType == CAP_FEE_NO_LOAN))
312312 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
313313 else if ((feeType == LOAN_FEE))
314314 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
315315 else if ((feeType == NO_LOAN_FEE))
316316 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
317317 else if ((feeType == NO_FEE))
318318 then 0
319319 else throw("Wrong fee type")
320320
321321
322322 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
323323
324324
325325 func getWXFarmingAddr (poolAddr) = {
326326 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
327327 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
328328 Address(fromBase58String(factroyCfg[1]))
329329 }
330330
331331
332332 func assetIdToStr (assetId) = match assetId {
333333 case id: ByteVector =>
334334 toBase58String(id)
335335 case waves: Unit =>
336336 "WAVES"
337337 case _ =>
338338 throw("Not Asset id")
339339 }
340340
341341
342342 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
343343 then unit
344344 else fromBase58String(assetId)
345345
346346
347347 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
348348 then 8
349349 else match assetInfo(fromBase58String(assetId)) {
350350 case asset: Asset =>
351351 asset.decimals
352352 case _ =>
353353 throw("Can't find asset")
354354 }
355355
356356
357357 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
358358
359359
360360 func getAssetsPrice (assetIds) = {
361361 func getPrices (a,assetId) = {
362- let assetPrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
362+ let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
363363 (a :+ assetPrice)
364364 }
365365
366366 let $l = assetIds
367367 let $s = size($l)
368368 let $acc0 = nil
369369 func $f0_1 ($a,$i) = if (($i >= $s))
370370 then $a
371371 else getPrices($a, $l[$i])
372372
373373 func $f0_2 ($a,$i) = if (($i >= $s))
374374 then $a
375375 else throw("List size exceeds 50")
376376
377377 $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)
378378 }
379379
380380
381381 func getSharePrice (shareId) = {
382382 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
383383 let poolAddr = Address(fromBase58String(pool))
384384 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
385- let $t01168211747 = getPoolData(poolAddr, pType)
386- let aId = $t01168211747._1
387- let bId = $t01168211747._2
388- let aBalance = $t01168211747._3
389- let bBalance = $t01168211747._4
390- let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
391- let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
392- let shareSupply = getShareSupply(poolAddr, pType, shareId)
393- let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
394- let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
395- let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
396- let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
397- fraction(sum, sharePrecision, shareSupply)
385+ let $t01169311758 = getPoolData(poolAddr, pType)
386+ let aId = $t01169311758._1
387+ let bId = $t01169311758._2
388+ let aBalance = $t01169311758._3
389+ let bBalance = $t01169311758._4
390+ let dPriceA = valueOrElse(getInteger(priceOracleAddr, (aId + kPriceInOracle)), -1)
391+ let dPriceB = valueOrElse(getInteger(priceOracleAddr, (bId + kPriceInOracle)), -1)
392+ if (if ((0 > dPriceA))
393+ then true
394+ else (0 > dPriceB))
395+ then -1
396+ else {
397+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
398+ let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
399+ let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
400+ let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
401+ let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
402+ fraction(sum, sharePrecision, shareSupply)
403+ }
398404 }
399405
400406
401407 func getSharePrices (shareIds) = {
402408 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
403409
404410 let $l = shareIds
405411 let $s = size($l)
406412 let $acc0 = nil
407413 func $f0_1 ($a,$i) = if (($i >= $s))
408414 then $a
409415 else getPrices($a, $l[$i])
410416
411417 func $f0_2 ($a,$i) = if (($i >= $s))
412418 then $a
413419 else throw("List size exceeds 20")
414420
415421 $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)
416422 }
417423
418424
419425 func getCursEntries (aId,bId,shareId,wAmounts) = {
420426 let assetsPrices = getAssetsPrice([aId, bId])
421427 let sharePrice = getSharePrice(shareId)
422428 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
423429 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
424430 }
425431
426432
427433 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
428434 then {
429435 let repl = {
430436 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
431437 if ($isInstanceOf(@, "List[Any]"))
432438 then @
433439 else throw(($getType(@) + " couldn't be cast to List[Any]"))
434440 }
435441 if ((repl == repl))
436442 then $Tuple5({
437443 let @ = repl[3]
438444 if ($isInstanceOf(@, "Int"))
439445 then @
440446 else throw(($getType(@) + " couldn't be cast to Int"))
441447 }, {
442448 let @ = repl[4]
443449 if ($isInstanceOf(@, "Int"))
444450 then @
445451 else throw(($getType(@) + " couldn't be cast to Int"))
446452 }, {
447453 let @ = repl[1]
448454 if ($isInstanceOf(@, "Int"))
449455 then @
450456 else throw(($getType(@) + " couldn't be cast to Int"))
451457 }, assetIdToStr(repl[2]), {
452458 let @ = repl[0]
453459 if ($isInstanceOf(@, "Int"))
454460 then @
455461 else throw(($getType(@) + " couldn't be cast to Int"))
456462 })
457463 else throw("Strict value is not equal to itself.")
458464 }
459465 else if ((pType == WX_POOL))
460466 then {
461- let $t01329213542 = $Tuple2(split({
467+ let $t01337013620 = $Tuple2(split({
462468 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
463469 if ($isInstanceOf(@, "String"))
464470 then @
465471 else throw(($getType(@) + " couldn't be cast to String"))
466472 }, "__"), split({
467473 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
468474 if ($isInstanceOf(@, "String"))
469475 then @
470476 else throw(($getType(@) + " couldn't be cast to String"))
471477 }, "__"))
472- if (($t01329213542 == $t01329213542))
478+ if (($t01337013620 == $t01337013620))
473479 then {
474- let evalPutInB = $t01329213542._2
475- let evalPutInA = $t01329213542._1
480+ let evalPutInB = $t01337013620._2
481+ let evalPutInA = $t01337013620._1
476482 let lpInA = parseIntValue(evalPutInA[1])
477483 let lpInB = parseIntValue(evalPutInB[1])
478484 if ((lpInB > lpInA))
479485 then {
480486 let pmt = parseIntValue(evalPutInA[8])
481487 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
482488 }
483489 else {
484490 let pmt = parseIntValue(evalPutInB[7])
485491 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
486492 }
487493 }
488494 else throw("Strict value is not equal to itself.")
489495 }
490496 else unknownPoolType()
491497
492498
493499 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
494500 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
495501 if ((pType == SF_POOL))
496502 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
497503 else if ((pType == WX_POOL))
498504 then invoke(poolAddr, "put", [1000000, false], payments)
499505 else unknownPoolType()
500506 }
501507
502508
503509 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
504510 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
505511 if ((pType == SF_POOL))
506512 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
507513 else if ((pType == WX_POOL))
508514 then invoke(poolAddr, "putOneTkn", [0, false], payments)
509515 else unknownPoolType()
510516 }
511517
512518
513519 func stakeLP (pool,pType,shareId,amount) = {
514520 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
515521 if ((pType == SF_POOL))
516522 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
517523 else if ((pType == WX_POOL))
518524 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
519525 else unknownPoolType()
520526 }
521527
522528
523529 func unstakeLP (pool,pType,shareId,amount) = {
524- let $t01520115551 = if ((pType == SF_POOL))
530+ let $t01527915629 = if ((pType == SF_POOL))
525531 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
526532 else if ((pType == WX_POOL))
527533 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
528534 else unknownPoolType()
529- let farmAddr = $t01520115551._1
530- let fName = $t01520115551._2
531- let params = $t01520115551._3
535+ let farmAddr = $t01527915629._1
536+ let fName = $t01527915629._2
537+ let params = $t01527915629._3
532538 let inv = invoke(farmAddr, fName, params, nil)
533539 if ((inv == inv))
534540 then amount
535541 else throw("Strict value is not equal to itself.")
536542 }
537543
538544
539545 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
540546 let poolAddr = Address(fromBase58String(pool))
541547 let feeScale6 = 1000000
542548 let fee = getIntegerValue(poolAddr, kSFPoolFee)
543549 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
544- let $t01597316279 = if ((assetTokenToGet == assetIdA))
550+ let $t01605116357 = if ((assetTokenToGet == assetIdA))
545551 then {
546552 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
547553 $Tuple2(amountToPay, assetIdB)
548554 }
549555 else {
550556 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
551557 $Tuple2(amountToPay, assetIdA)
552558 }
553- let amountToPay = $t01597316279._1
554- let assetToPay = $t01597316279._2
559+ let amountToPay = $t01605116357._1
560+ let assetToPay = $t01605116357._2
555561 $Tuple2(assetToPay, amountToPay)
556562 }
557563
558564
559565 func getWXSwapFees (pool) = {
560566 let poolAddr = addressFromStringValue(pool)
561567 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
562568 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
563569 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
564570 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
565571 case fees: (Int, Int) =>
566572 $Tuple2(fees._1, fees._2)
567573 case _ =>
568574 $Tuple2(poolFeeDefault, protocolFeeDefault)
569575 }
570576 }
571577
572578
573579 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
574- let $t01701917058 = getWXSwapFees(pool)
575- let pFee = $t01701917058._1
576- let prFee = $t01701917058._2
580+ let $t01709717136 = getWXSwapFees(pool)
581+ let pFee = $t01709717136._1
582+ let prFee = $t01709717136._2
577583 let feeScale = toBigInt(100000000)
578- let $t01709817406 = if ((assetTokenToGet == assetIdA))
584+ let $t01717617484 = if ((assetTokenToGet == assetIdA))
579585 then {
580586 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
581587 $Tuple2(amountToPay, assetIdB)
582588 }
583589 else {
584590 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
585591 $Tuple2(amountToPay, assetIdA)
586592 }
587- let amountToPay = $t01709817406._1
588- let assetToPay = $t01709817406._2
593+ let amountToPay = $t01717617484._1
594+ let assetToPay = $t01717617484._2
589595 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
590596 $Tuple2(assetToPay, amountToPayWithFee)
591597 }
592598
593599
594600 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((pType == SF_POOL))
595601 then {
596- let $t01775317875 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
597- let assetToPay = $t01775317875._1
598- let amountToPay = $t01775317875._2
602+ let $t01783117953 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
603+ let assetToPay = $t01783117953._1
604+ let amountToPay = $t01783117953._2
599605 invoke(addressFromStringValue(pool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
600606 }
601607 else if ((pType == WX_POOL))
602608 then {
603- let $t01807518197 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604- let assetToPay = $t01807518197._1
605- let amountToPay = $t01807518197._2
609+ let $t01815318275 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
610+ let assetToPay = $t01815318275._1
611+ let amountToPay = $t01815318275._2
606612 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
607613 }
608614 else unknownPoolType()
609615
610616
611617 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
612- let $t01848418948 = if ((pType == SF_POOL))
618+ let $t01856219026 = if ((pType == SF_POOL))
613619 then {
614620 let inv = {
615621 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
616622 if ($isInstanceOf(@, "List[Any]"))
617623 then @
618624 else throw(($getType(@) + " couldn't be cast to List[Any]"))
619625 }
620626 if ((inv == inv))
621627 then $Tuple2({
622628 let @ = inv[0]
623629 if ($isInstanceOf(@, "Int"))
624630 then @
625631 else throw(($getType(@) + " couldn't be cast to Int"))
626632 }, {
627633 let @ = inv[1]
628634 if ($isInstanceOf(@, "Int"))
629635 then @
630636 else throw(($getType(@) + " couldn't be cast to Int"))
631637 })
632638 else throw("Strict value is not equal to itself.")
633639 }
634640 else if ((pType == WX_POOL))
635641 then {
636642 let inv = split({
637643 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
638644 if ($isInstanceOf(@, "String"))
639645 then @
640646 else throw(($getType(@) + " couldn't be cast to String"))
641647 }, "__")
642648 if ((inv == inv))
643649 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
644650 else throw("Strict value is not equal to itself.")
645651 }
646652 else unknownPoolType()
647- let amountA = $t01848418948._1
648- let amountB = $t01848418948._2
653+ let amountA = $t01856219026._1
654+ let amountB = $t01856219026._2
649655 $Tuple2(amountA, amountB)
650656 }
651657
652658
653659 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
654660 then {
655661 let balBefore = accountBalance(SWOPID)
656662 if ((balBefore == balBefore))
657663 then {
658664 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
659665 if ((inv == inv))
660666 then {
661667 let balAfter = accountBalance(SWOPID)
662668 $Tuple2((balAfter - balBefore), SWOPID)
663669 }
664670 else throw("Strict value is not equal to itself.")
665671 }
666672 else throw("Strict value is not equal to itself.")
667673 }
668674 else if ((pType == WX_POOL))
669675 then {
670- let $t01931619395 = getWXPoolData(addressFromStringValue(pool))
671- let aId = $t01931619395._1
672- let bId = $t01931619395._2
673- let aBal = $t01931619395._3
674- let bBal = $t01931619395._4
675- let lpId = $t01931619395._5
676+ let $t01939419473 = getWXPoolData(addressFromStringValue(pool))
677+ let aId = $t01939419473._1
678+ let bId = $t01939419473._2
679+ let aBal = $t01939419473._3
680+ let bBal = $t01939419473._4
681+ let lpId = $t01939419473._5
676682 let balBefore = accountBalance(WXID)
677683 if ((balBefore == balBefore))
678684 then {
679685 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
680686 if ((inv == inv))
681687 then {
682688 let balAfter = accountBalance(WXID)
683689 $Tuple2((balAfter - balBefore), WXID)
684690 }
685691 else throw("Strict value is not equal to itself.")
686692 }
687693 else throw("Strict value is not equal to itself.")
688694 }
689695 else unknownPoolType()
690696
691697
692698 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
693699 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
694700 if ((lpBalanceBefore == lpBalanceBefore))
695701 then {
696702 let poolAddr = addressFromStringValue(pool)
697- let $t01999320409 = if (if ((pmtA > 0))
703+ let $t02007120487 = if (if ((pmtA > 0))
698704 then (pmtB > 0)
699705 else false)
700706 then {
701- let $t02005920175 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
702- let pmtInA = $t02005920175._1
703- let pmtInB = $t02005920175._2
704- let change = $t02005920175._3
705- let changeId = $t02005920175._4
707+ let $t02013720253 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
708+ let pmtInA = $t02013720253._1
709+ let pmtInB = $t02013720253._2
710+ let change = $t02013720253._3
711+ let changeId = $t02013720253._4
706712 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
707713 if ((inv == inv))
708714 then $Tuple2(change, changeId)
709715 else throw("Strict value is not equal to itself.")
710716 }
711717 else if ((pmtA > 0))
712718 then $Tuple2(pmtA, aId)
713719 else if ((pmtB > 0))
714720 then $Tuple2(pmtB, bId)
715721 else throw("pmts must be > 0")
716- let change = $t01999320409._1
717- let changeId = $t01999320409._2
722+ let change = $t02007120487._1
723+ let changeId = $t02007120487._2
718724 let inv = if ((change > 0))
719725 then replenishOneTokenByType(poolAddr, pType, change, changeId)
720726 else nil
721727 if ((inv == inv))
722728 then {
723729 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
724730 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
725731 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
726732 let userShareForStake = (totalStaked - axlyFeeAmount)
727733 if ((0 >= userShareForStake))
728734 then throw("amount of staked sharetokens must be > 0")
729735 else {
730736 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
731737 if ((invLP == invLP))
732738 then $Tuple2(userShareForStake, axlyFeeAmount)
733739 else throw("Strict value is not equal to itself.")
734740 }
735741 }
736742 else throw("Strict value is not equal to itself.")
737743 }
738744 else throw("Strict value is not equal to itself.")
739745 }
740746
741747
742748 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
743749 let totalAmount = getPoolTotalShare(pool)
744750 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
745- let $t02126621504 = if (withLoan)
751+ let $t02134421582 = if (withLoan)
746752 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
747753 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
748- let curPoolInterest = $t02126621504._1
749- let totalStakedWithLoan = $t02126621504._2
754+ let curPoolInterest = $t02134421582._1
755+ let totalStakedWithLoan = $t02134421582._2
750756 [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))]
751757 }
752758
753759
754760 func exchangeKeeper (toToken,pmtAmount,pmtAsset,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
755761 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
756762 if ((tokenBalanceBefore == tokenBalanceBefore))
757763 then {
758764 let inv = invoke(exContract, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [AttachedPayment(pmtAsset, pmtAmount)])
759765 if ((inv == inv))
760766 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
761767 else throw("Strict value is not equal to itself.")
762768 }
763769 else throw("Strict value is not equal to itself.")
764770 }
765771
766772
767773 func exchangePuzzle (toToken,pmtAmount,pmtAsset,routesStr,minToReceive,options) = {
768774 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
769775 if ((tokenBalanceBefore == tokenBalanceBefore))
770776 then {
771777 let inv = invoke(exContract, "puzzleSwap", [routesStr, minToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
772778 if ((inv == inv))
773779 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
774780 else throw("Strict value is not equal to itself.")
775781 }
776782 else throw("Strict value is not equal to itself.")
777783 }
778784
779785
780786 func exchangeSwopFi (toToken,pmtAmount,pmtAsset,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
781787 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
782788 if ((tokenBalanceBefore == tokenBalanceBefore))
783789 then {
784790 let inv = invoke(exContract, "swopfiSwap", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
785791 if ((inv == inv))
786792 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
787793 else throw("Strict value is not equal to itself.")
788794 }
789795 else throw("Strict value is not equal to itself.")
790796 }
791797
792798
793799 func capitalize (pool,pType,tokenId,tokenAmount) = {
794800 let poolAddr = Address(fromBase58String(pool))
795- let $t02385823924 = getPoolData(poolAddr, pType)
796- let AId = $t02385823924._1
797- let BId = $t02385823924._2
798- let balA = $t02385823924._3
799- let balB = $t02385823924._4
800- let shareId = $t02385823924._5
801+ let $t02393624002 = getPoolData(poolAddr, pType)
802+ let AId = $t02393624002._1
803+ let BId = $t02393624002._2
804+ let balA = $t02393624002._3
805+ let balB = $t02393624002._4
806+ let shareId = $t02393624002._5
801807 if (if ((tokenId != AId))
802808 then (tokenId != BId)
803809 else false)
804810 then throw("Wrong asset")
805811 else {
806812 let totalShareAmount = getPoolTotalShare(pool)
807813 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
808814 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
809815 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
810816 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
811817 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
812818 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
813819 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
814- let $t02456424664 = if ((tokenId == AId))
820+ let $t02464224742 = if ((tokenId == AId))
815821 then $Tuple2((tokenAmount - axlyFee), 0)
816822 else $Tuple2(0, (tokenAmount - axlyFee))
817- let pmtA = $t02456424664._1
818- let pmtB = $t02456424664._2
819- let $t02466724771 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
820- let stakedAmount = $t02466724771._1
821- let nf = $t02466724771._2
823+ let pmtA = $t02464224742._1
824+ let pmtB = $t02464224742._2
825+ let $t02474524849 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
826+ let stakedAmount = $t02474524849._1
827+ let nf = $t02474524849._2
822828 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
823829 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
824830 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
825831 let stakedNoLoan = (stakedAmount - stakedLoan)
826832 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
827833 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
828834 else 0
829835 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
830836 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
831837 else 0
832838 ([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))
833839 }
834840 }
835841
836842
837843 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
838844 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
839845 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
840846 let poolInterest = if (borrowed)
841847 then getIntegerValue(this, (pool + kPoolInterestLoan))
842848 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
843849 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
844850 }
845851
846852
847853 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
848854 let feeType = if (isBorrowed)
849855 then STOPLOSS_LOAN
850856 else STOPLOSS_FEE_NO_LOAN
851857 if (stopLoss)
852858 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
853859 else 0
854860 }
855861
856862
857863 func withdrawToUser (user,pool,posId,stopLoss) = {
858864 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
859865 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
860866 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
861867 let poolTotalShare = getPoolTotalShare(pool)
862868 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
863869 let userAddr = Address(fromBase58String(user))
864870 let poolAddr = Address(fromBase58String(pool))
865871 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
866- let $t02730227374 = getPoolData(poolAddr, pType)
867- let idAStr = $t02730227374._1
868- let idBStr = $t02730227374._2
869- let balA = $t02730227374._3
870- let balB = $t02730227374._4
871- let shareId = $t02730227374._5
872- let $t02737727444 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
873- let idA = $t02737727444._1
874- let idB = $t02737727444._2
872+ let $t02738027452 = getPoolData(poolAddr, pType)
873+ let idAStr = $t02738027452._1
874+ let idBStr = $t02738027452._2
875+ let balA = $t02738027452._3
876+ let balB = $t02738027452._4
877+ let shareId = $t02738027452._5
878+ let $t02745527522 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
879+ let idA = $t02745527522._1
880+ let idB = $t02745527522._2
875881 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
876882 let cBalABefore = accountBalance(idA)
877883 if ((cBalABefore == cBalABefore))
878884 then {
879885 let cBalBBefore = accountBalance(idB)
880886 if ((cBalBBefore == cBalBBefore))
881887 then {
882888 let inv = if ((pType == SF_POOL))
883889 then {
884890 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
885891 if ((inv == inv))
886892 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
887893 else throw("Strict value is not equal to itself.")
888894 }
889895 else if ((pType == WX_POOL))
890896 then {
891897 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
892898 if ((inv == inv))
893899 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
894900 else throw("Strict value is not equal to itself.")
895901 }
896902 else unknownPoolType()
897903 if ((inv == inv))
898904 then {
899905 let cBalAAfter = accountBalance(idA)
900906 if ((cBalAAfter == cBalAAfter))
901907 then {
902908 let cBalBAfter = accountBalance(idB)
903909 if ((cBalBAfter == cBalBAfter))
904910 then {
905- let $t02813928228 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
906- let tokensAmountA = $t02813928228._1
907- let tokensAmountB = $t02813928228._2
908- let $t02823129467 = if (isBorrowed)
911+ let $t02821728306 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
912+ let tokensAmountA = $t02821728306._1
913+ let tokensAmountB = $t02821728306._2
914+ let $t02830929545 = if (isBorrowed)
909915 then {
910916 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
911917 let debt = {
912918 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
913919 if ($isInstanceOf(@, "Int"))
914920 then @
915921 else throw(($getType(@) + " couldn't be cast to Int"))
916922 }
917923 if ((debt == debt))
918924 then {
919925 let amountToGetEx = if (if ((borrowAsset == idAStr))
920926 then (debt > tokensAmountA)
921927 else false)
922928 then (debt - tokensAmountA)
923929 else if (if ((borrowAsset == idBStr))
924930 then (debt > tokensAmountB)
925931 else false)
926932 then (debt - tokensAmountB)
927933 else 0
928934 let exInv = if ((amountToGetEx > 0))
929935 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
930936 else nil
931937 if ((exInv == exInv))
932938 then {
933939 let cBalAAfterRepay = accountBalance(idA)
934940 if ((cBalAAfterRepay == cBalAAfterRepay))
935941 then {
936942 let cBalBAfterRepay = accountBalance(idB)
937943 if ((cBalBAfterRepay == cBalBAfterRepay))
938944 then {
939945 let closeDbtInv = if ((debt > 0))
940946 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
941947 else 0
942948 if ((closeDbtInv == closeDbtInv))
943949 then if ((borrowAsset == idAStr))
944950 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
945951 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
946952 else throw("Strict value is not equal to itself.")
947953 }
948954 else throw("Strict value is not equal to itself.")
949955 }
950956 else throw("Strict value is not equal to itself.")
951957 }
952958 else throw("Strict value is not equal to itself.")
953959 }
954960 else throw("Strict value is not equal to itself.")
955961 }
956962 else $Tuple2(tokensAmountA, tokensAmountB)
957- let toUserA = $t02823129467._1
958- let toUserB = $t02823129467._2
963+ let toUserA = $t02830929545._1
964+ let toUserB = $t02830929545._2
959965 let poolTotalLoanEntries = if (isBorrowed)
960966 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
961967 else nil
962968 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))
963969 $Tuple2(entries, [toUserA, toUserB])
964970 }
965971 else throw("Strict value is not equal to itself.")
966972 }
967973 else throw("Strict value is not equal to itself.")
968974 }
969975 else throw("Strict value is not equal to itself.")
970976 }
971977 else throw("Strict value is not equal to itself.")
972978 }
973979 else throw("Strict value is not equal to itself.")
974980 }
975981
976982
977983 func parseRequest (requestId) = {
978984 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
979985 let user = request[0]
980986 let pool = request[1]
981987 let pmtA = parseIntValue(request[2])
982988 let AId = request[3]
983989 let pmtB = parseIntValue(request[4])
984990 let BId = request[5]
985991 let balA = parseIntValue(request[6])
986992 let balB = parseIntValue(request[7])
987993 let shareId = request[8]
988994 let bwAsset = request[9]
989995 let bwAmount = parseIntValue(request[10])
990996 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
991997 }
992998
993999
9941000 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
9951001 then (borrowId != bId)
9961002 else false)
9971003 then throw("Wrong borrow asset")
9981004 else {
9991005 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
10001006 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
10011007 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10021008 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10031009 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1004- let $t03144931546 = if ((borrowId == aId))
1010+ let $t03152731624 = if ((borrowId == aId))
10051011 then $Tuple2(dPriceA, decPrA)
10061012 else $Tuple2(dPriceB, decPrB)
1007- let borrowPrice = $t03144931546._1
1008- let borrowDecPr = $t03144931546._2
1013+ let borrowPrice = $t03152731624._1
1014+ let borrowDecPr = $t03152731624._2
10091015 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10101016 }
10111017
10121018
10131019 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
10141020 then if ((assetIdToStr(pmts[0].assetId) != AId))
10151021 then throw("Wrong payment asset A")
10161022 else if ((assetIdToStr(pmts[1].assetId) != BId))
10171023 then throw("Wrong payment asset B")
10181024 else $Tuple2(pmts[0].amount, pmts[1].amount)
10191025 else if ((size(pmts) == 1))
10201026 then if ((assetIdToStr(pmts[0].assetId) == AId))
10211027 then $Tuple2(pmts[0].amount, 0)
10221028 else if ((assetIdToStr(pmts[0].assetId) == BId))
10231029 then $Tuple2(0, pmts[0].amount)
10241030 else throw("Wrong payment")
10251031 else throw("One or two payments expected")
10261032
10271033
10281034 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
10291035 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
10301036 if ((0 > pri))
10311037 then (pri * -1)
10321038 else pri
10331039 }
10341040
10351041
10361042 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1037- let $t03254632805 = if (claim)
1043+ let $t03262432883 = if (claim)
10381044 then claimFarmed(pType, pool)
10391045 else {
10401046 let claimedAsset = if ((pType == SF_POOL))
10411047 then SWOPID
10421048 else if ((pType == WX_POOL))
10431049 then WXID
10441050 else unknownPoolType()
10451051 $Tuple2(amount, claimedAsset)
10461052 }
1047- let claimAmount = $t03254632805._1
1048- let claimAsset = $t03254632805._2
1053+ let claimAmount = $t03262432883._1
1054+ let claimAsset = $t03262432883._2
10491055 let bal = accountBalance(claimAsset)
10501056 if (if ((amount > (claimAmount + change)))
10511057 then true
10521058 else (amount > bal))
10531059 then throw("To big amount to exchange")
10541060 else $Tuple2(claimAmount, claimAsset)
10551061 }
1062+
1063+
1064+@Callable(i)
1065+func getPoolInfoREADONLY (pool) = {
1066+ let poolAddr = addressFromStringValue(pool)
1067+ let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1068+ let $t03328033370 = getPoolData(Address(fromBase58String(pool)), pType)
1069+ let AId = $t03328033370._1
1070+ let BId = $t03328033370._2
1071+ let balA = $t03328033370._3
1072+ let balB = $t03328033370._4
1073+ let shareId = $t03328033370._5
1074+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
1075+ $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
1076+ }
1077+
10561078
10571079
10581080 @Callable(i)
10591081 func getShareAssetPriceREADONLY (shareId) = {
10601082 let sharePrices = getSharePrice(shareId)
10611083 $Tuple2(nil, sharePrices)
10621084 }
10631085
10641086
10651087
10661088 @Callable(i)
10671089 func getUserPositionShareAmountREADONLY (user,posNum) = {
10681090 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
10691091 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
10701092 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
10711093 $Tuple2(nil, userCanWithdraw)
10721094 }
10731095
10741096
10751097
10761098 @Callable(i)
10771099 func getUserPositionREADONLY (user,pools,posNum) = {
10781100 func userPos (a,pool) = {
1079- let $t03376733837 = a
1080- let wAmountsA = $t03376733837._1
1081- let wAmountsB = $t03376733837._2
1082- let debts = $t03376733837._3
1083- let eqWAmountsA = $t03376733837._4
1084- let eqWAmountsB = $t03376733837._5
1085- let index = $t03376733837._6
1101+ let $t03424334313 = a
1102+ let wAmountsA = $t03424334313._1
1103+ let wAmountsB = $t03424334313._2
1104+ let debts = $t03424334313._3
1105+ let eqWAmountsA = $t03424334313._4
1106+ let eqWAmountsB = $t03424334313._5
1107+ let index = $t03424334313._6
10861108 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
10871109 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
10881110 else {
10891111 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1090- let $t03411634206 = getPoolData(Address(fromBase58String(pool)), pType)
1091- let AId = $t03411634206._1
1092- let BId = $t03411634206._2
1093- let balA = $t03411634206._3
1094- let balB = $t03411634206._4
1095- let shareId = $t03411634206._5
1112+ let $t03459234682 = getPoolData(Address(fromBase58String(pool)), pType)
1113+ let AId = $t03459234682._1
1114+ let BId = $t03459234682._2
1115+ let balA = $t03459234682._3
1116+ let balB = $t03459234682._4
1117+ let shareId = $t03459234682._5
10961118 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
10971119 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1098- let $t03442234542 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1099- let wAmountA = $t03442234542._1
1100- let wAmountB = $t03442234542._2
1120+ let $t03489835018 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1121+ let wAmountA = $t03489835018._1
1122+ let wAmountB = $t03489835018._2
11011123 if ((borrowAmount > 0))
11021124 then {
11031125 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11041126 let debt = {
11051127 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
11061128 if ($isInstanceOf(@, "Int"))
11071129 then @
11081130 else throw(($getType(@) + " couldn't be cast to Int"))
11091131 }
11101132 if ((debt == debt))
11111133 then {
11121134 let amountToGetEx = if (if ((borrowAsset == AId))
11131135 then (debt > wAmountA)
11141136 else false)
11151137 then (debt - wAmountA)
11161138 else if (if ((borrowAsset == BId))
11171139 then (debt > wAmountB)
11181140 else false)
11191141 then (debt - wAmountB)
11201142 else 0
11211143 let amountToPay = if ((amountToGetEx > 0))
11221144 then if ((pType == SF_POOL))
11231145 then {
11241146 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
11251147 ex._2
11261148 }
11271149 else if ((pType == WX_POOL))
11281150 then {
11291151 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
11301152 ex._2
11311153 }
11321154 else unknownPoolType()
11331155 else 0
1134- let $t03545435673 = if ((borrowAsset == AId))
1156+ let $t03593036149 = if ((borrowAsset == AId))
11351157 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
11361158 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1137- let eqWAmountA = $t03545435673._1
1138- let eqWAmountB = $t03545435673._2
1159+ let eqWAmountA = $t03593036149._1
1160+ let eqWAmountB = $t03593036149._2
11391161 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
11401162 }
11411163 else throw("Strict value is not equal to itself.")
11421164 }
11431165 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
11441166 }
11451167 }
11461168
1147- let $t03592836039 = {
1169+ let $t03640436515 = {
11481170 let $l = pools
11491171 let $s = size($l)
11501172 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
11511173 func $f0_1 ($a,$i) = if (($i >= $s))
11521174 then $a
11531175 else userPos($a, $l[$i])
11541176
11551177 func $f0_2 ($a,$i) = if (($i >= $s))
11561178 then $a
11571179 else throw("List size exceeds 20")
11581180
11591181 $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)
11601182 }
1161- let wAmountsA = $t03592836039._1
1162- let wAmountsB = $t03592836039._2
1163- let debts = $t03592836039._3
1164- let eqWAmountsA = $t03592836039._4
1165- let eqWAmountsB = $t03592836039._5
1183+ let wAmountsA = $t03640436515._1
1184+ let wAmountsB = $t03640436515._2
1185+ let debts = $t03640436515._3
1186+ let eqWAmountsA = $t03640436515._4
1187+ let eqWAmountsB = $t03640436515._5
11661188 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
11671189 }
11681190
11691191
11701192
11711193 @Callable(i)
11721194 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
11731195 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
11741196 if (!(isPoolActive(pool, pType)))
11751197 then throw("Pool not active at this moment")
11761198 else if (if ((100 > leverage))
11771199 then true
11781200 else (leverage > 300))
11791201 then throw("Leverage can't be <100 and >300")
11801202 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
11811203 then (leverage > 100)
11821204 else false)
11831205 then throw("You can't borrow in this pool")
11841206 else {
1185- let $t03663736727 = getPoolData(Address(fromBase58String(pool)), pType)
1186- let AId = $t03663736727._1
1187- let BId = $t03663736727._2
1188- let balA = $t03663736727._3
1189- let balB = $t03663736727._4
1190- let shareId = $t03663736727._5
1207+ let $t03711337203 = getPoolData(Address(fromBase58String(pool)), pType)
1208+ let AId = $t03711337203._1
1209+ let BId = $t03711337203._2
1210+ let balA = $t03711337203._3
1211+ let balB = $t03711337203._4
1212+ let shareId = $t03711337203._5
11911213 if (if ((borrowId != AId))
11921214 then (borrowId != BId)
11931215 else false)
11941216 then throw("Wrong borrow asset")
11951217 else {
1196- let $t03680836867 = parseReplenishPmts(i.payments, AId, BId)
1197- let pmtA = $t03680836867._1
1198- let pmtB = $t03680836867._2
1218+ let $t03728437343 = parseReplenishPmts(i.payments, AId, BId)
1219+ let pmtA = $t03728437343._1
1220+ let pmtB = $t03728437343._2
11991221 let user = toString(i.caller)
12001222 let newPosNum = getNewUserPositionNumber(user)
12011223 if ((leverage > 100))
12021224 then {
12031225 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
12041226 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
12051227 let newRequestId = {
12061228 let @ = invoke(this, "createNewRequest", [request], nil)
12071229 if ($isInstanceOf(@, "Int"))
12081230 then @
12091231 else throw(($getType(@) + " couldn't be cast to Int"))
12101232 }
12111233 if ((newRequestId == newRequestId))
12121234 then {
12131235 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
12141236 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
12151237 if ((inv == inv))
12161238 then {
12171239 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1218- let $t03785637950 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1219- if (($t03785637950 == $t03785637950))
1240+ let $t03833238426 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1241+ if (($t03833238426 == $t03833238426))
12201242 then {
1221- let newBalB = $t03785637950._2
1222- let newBalA = $t03785637950._1
1243+ let newBalB = $t03833238426._2
1244+ let newBalA = $t03833238426._1
12231245 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1224- let $t03802038135 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1225- let wAmountA = $t03802038135._1
1226- let wAmountB = $t03802038135._2
1246+ let $t03849638611 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1247+ let wAmountA = $t03849638611._1
1248+ let wAmountB = $t03849638611._2
12271249 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
12281250 }
12291251 else throw("Strict value is not equal to itself.")
12301252 }
12311253 else throw("Strict value is not equal to itself.")
12321254 }
12331255 else throw("Strict value is not equal to itself.")
12341256 }
12351257 else {
1236- let $t03818838303 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1237- if (($t03818838303 == $t03818838303))
1258+ let $t03866438779 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1259+ if (($t03866438779 == $t03866438779))
12381260 then {
1239- let axlyFee = $t03818838303._2
1240- let userStaked = $t03818838303._1
1241- let $t03830938403 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1242- if (($t03830938403 == $t03830938403))
1261+ let axlyFee = $t03866438779._2
1262+ let userStaked = $t03866438779._1
1263+ let $t03878538879 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1264+ if (($t03878538879 == $t03878538879))
12431265 then {
1244- let newBalB = $t03830938403._2
1245- let newBalA = $t03830938403._1
1266+ let newBalB = $t03878538879._2
1267+ let newBalA = $t03878538879._1
12461268 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1247- let $t03847338588 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1248- let wAmountA = $t03847338588._1
1249- let wAmountB = $t03847338588._2
1269+ let $t03894939064 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1270+ let wAmountA = $t03894939064._1
1271+ let wAmountB = $t03894939064._2
12501272 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
12511273 }
12521274 else throw("Strict value is not equal to itself.")
12531275 }
12541276 else throw("Strict value is not equal to itself.")
12551277 }
12561278 }
12571279 }
12581280 })
12591281
12601282
12611283
12621284 @Callable(i)
12631285 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
12641286 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
12651287 if (!(isPoolActive(pool, pType)))
12661288 then throw("Pool not active at this moment")
12671289 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
12681290 })
12691291
12701292
12711293
12721294 @Callable(i)
12731295 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
12741296 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
12751297 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
12761298 if (!(isPoolActive(poolId, pType)))
12771299 then throw("Pool not active at this moment")
12781300 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
12791301 then throw("There are no user position")
12801302 else if ((0 >= price))
12811303 then throw("Price must be greater than 0")
12821304 else if ((price > tokenOraclePrice))
12831305 then throw("Price must be less than current token price")
12841306 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
12851307 })
12861308
12871309
12881310
12891311 @Callable(i)
12901312 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
12911313 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
12921314 if (!(isPoolActive(poolId, pType)))
12931315 then throw("Pool not active at this moment")
12941316 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
12951317 then throw("No entry")
12961318 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
12971319 })
12981320
12991321
13001322
13011323 @Callable(i)
13021324 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
13031325 then throw("Already inited")
13041326 else if (!(isDefined(addressFromString(moneyBoxAddr))))
13051327 then throw("moneyBoxAddr is not correct address")
13061328 else if (!(isDefined(addressFromString(sfFarmingAddr))))
13071329 then throw("sfFarmingAddr is not correct address")
13081330 else if (!(isDefined(addressFromString(lendAddr))))
13091331 then throw("lendAddr is not correct address")
13101332 else if (!(isDefined(addressFromString(priceOracleAddr))))
13111333 then throw("priceOracleAddr is not correct address")
13121334 else if (!(isDefined(addressFromString(keeperExContract))))
13131335 then throw("keeperExContract is not correct address")
13141336 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
13151337 then throw("swopAssetId is not correct asset id")
13161338 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
13171339 then throw("swopAssetId is not correct asset id")
13181340 else if ((size(fromBase58String(operatorPubKey)) != 32))
13191341 then throw("operatorPubKey is not correct")
13201342 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
13211343 then throw("group1Admin1PubKey is not correct")
13221344 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
13231345 then throw("group1Admin2PubKey is not correct")
13241346 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
13251347 then throw("group2Admin1PubKey is not correct")
13261348 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
13271349 then throw("group2Admin2PubKey is not correct")
13281350 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)])
13291351
13301352
13311353
13321354 @Callable(i)
13331355 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
13341356 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
13351357 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
13361358 })
13371359
13381360
13391361
13401362 @Callable(i)
13411363 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1342- let $t04342743531 = parseRequest(requestId)
1343- let user = $t04342743531._1
1344- let pool = $t04342743531._2
1345- let pmtA = $t04342743531._3
1346- let AId = $t04342743531._4
1347- let pmtB = $t04342743531._5
1348- let BId = $t04342743531._6
1349- let balA = $t04342743531._7
1350- let balB = $t04342743531._8
1351- let shareId = $t04342743531._9
1352- let bwAsset = $t04342743531._10
1353- let bwAmount = $t04342743531._11
1364+ let $t04390344007 = parseRequest(requestId)
1365+ let user = $t04390344007._1
1366+ let pool = $t04390344007._2
1367+ let pmtA = $t04390344007._3
1368+ let AId = $t04390344007._4
1369+ let pmtB = $t04390344007._5
1370+ let BId = $t04390344007._6
1371+ let balA = $t04390344007._7
1372+ let balB = $t04390344007._8
1373+ let shareId = $t04390344007._9
1374+ let bwAsset = $t04390344007._10
1375+ let bwAmount = $t04390344007._11
13541376 if ((size(i.payments) != 1))
13551377 then throw("Wrong payment size")
13561378 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
13571379 then true
13581380 else (i.payments[0].amount != bwAmount))
13591381 then throw("Wrong payment")
13601382 else {
1361- let $t04372143821 = if ((AId == bwAsset))
1383+ let $t04419744297 = if ((AId == bwAsset))
13621384 then $Tuple2((pmtA + bwAmount), pmtB)
13631385 else $Tuple2(pmtA, (pmtB + bwAmount))
1364- let pmtAllA = $t04372143821._1
1365- let pmtAllB = $t04372143821._2
1386+ let pmtAllA = $t04419744297._1
1387+ let pmtAllB = $t04419744297._2
13661388 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1367- let $t04390344018 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1368- let userStaked = $t04390344018._1
1369- let axlyFee = $t04390344018._2
1389+ let $t04437944494 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1390+ let userStaked = $t04437944494._1
1391+ let axlyFee = $t04437944494._2
13701392 let posNum = getNewUserPositionNumber(user)
13711393 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
13721394 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1373- let $t04437844493 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1374- let wAmountA = $t04437844493._1
1375- let wAmountB = $t04437844493._2
1395+ let $t04485444969 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1396+ let wAmountA = $t04485444969._1
1397+ let wAmountB = $t04485444969._2
13761398 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
13771399 }
13781400 }))
13791401
13801402
13811403
13821404 @Callable(i)
13831405 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
13841406 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13851407 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1386- let $t04501445104 = getPoolData(Address(fromBase58String(pool)), pType)
1387- let AId = $t04501445104._1
1388- let BId = $t04501445104._2
1389- let balA = $t04501445104._3
1390- let balB = $t04501445104._4
1391- let shareId = $t04501445104._5
1408+ let $t04549045580 = getPoolData(Address(fromBase58String(pool)), pType)
1409+ let AId = $t04549045580._1
1410+ let BId = $t04549045580._2
1411+ let balA = $t04549045580._3
1412+ let balB = $t04549045580._4
1413+ let shareId = $t04549045580._5
13921414 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
13931415 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
13941416 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13951417 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
13961418 if ((liquidateAmount > userCanWithdraw))
13971419 then throw("You can't liquidate more than user have")
13981420 else if ((borrowAmount == 0))
13991421 then throw("You can't liquidate position without borrow")
14001422 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))]
14011423 }))
14021424
14031425
14041426
14051427 @Callable(i)
14061428 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14071429 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14081430 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
14091431 if ((tokenOraclePrice > stopLossPrice))
14101432 then throw("Token price greater stop loss price")
14111433 else {
14121434 let res = withdrawToUser(user, pool, toString(posId), true)
14131435 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
14141436 }
14151437 }))
14161438
14171439
14181440
14191441 @Callable(i)
14201442 func capitalizeExKeeper (pool,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14211443 let pType = getStringValue(this, (kPool + pool))
14221444 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1423- let $t04725347352 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1424- let claimedAmount = $t04725347352._1
1425- let claimedAsset = $t04725347352._2
1445+ let $t04772947828 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1446+ let claimedAmount = $t04772947828._1
1447+ let claimedAsset = $t04772947828._2
14261448 let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
14271449 let newChange = ((claimedAmount + change) - amountToExchange)
14281450 let changeEntry = if ((newChange >= 0))
14291451 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14301452 else throw("Negative change")
14311453 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14321454 }))
14331455
14341456
14351457
14361458 @Callable(i)
14371459 func capitalizeExPuzzle (pool,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14381460 let pType = getStringValue(this, (kPool + pool))
14391461 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1440- let $t04815248251 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1441- let claimedAmount = $t04815248251._1
1442- let claimedAsset = $t04815248251._2
1462+ let $t04862848727 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1463+ let claimedAmount = $t04862848727._1
1464+ let claimedAsset = $t04862848727._2
14431465 let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
14441466 let newChange = ((claimedAmount + change) - amountToExchange)
14451467 let changeEntry = if ((newChange >= 0))
14461468 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14471469 else nil
14481470 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14491471 }))
14501472
14511473
14521474
14531475 @Callable(i)
14541476 func capitalizeExSwopFi (pool,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14551477 let pType = getStringValue(this, (kPool + pool))
14561478 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1457- let $t04909649195 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1458- let claimedAmount = $t04909649195._1
1459- let claimedAsset = $t04909649195._2
1479+ let $t04957249671 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1480+ let claimedAmount = $t04957249671._1
1481+ let claimedAsset = $t04957249671._2
14601482 let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
14611483 let newChange = ((claimedAmount + change) - amountToExchange)
14621484 let changeEntry = if ((newChange >= 0))
14631485 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14641486 else nil
14651487 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14661488 }))
14671489
14681490
14691491
14701492 @Callable(i)
14711493 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14721494 let pType = getStringValue(this, (kPool + pool))
1473- let $t04979249887 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1474- let claimedAmount = $t04979249887._1
1475- let claimedAsset = $t04979249887._2
1495+ let $t05026850363 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1496+ let claimedAmount = $t05026850363._1
1497+ let claimedAsset = $t05026850363._2
14761498 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
14771499 }))
14781500
14791501
14801502
14811503 @Callable(i)
14821504 func initNewPool (type,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
14831505 then (type != WX_POOL)
14841506 else false)
14851507 then throw("Wrong type")
14861508 else {
1487- let $t05031350407 = getPoolData(Address(fromBase58String(poolAddr)), type)
1488- let aId = $t05031350407._1
1489- let bId = $t05031350407._2
1490- let aBal = $t05031350407._3
1491- let bBal = $t05031350407._4
1492- let shareId = $t05031350407._5
1509+ let $t05078950883 = getPoolData(Address(fromBase58String(poolAddr)), type)
1510+ let aId = $t05078950883._1
1511+ let bId = $t05078950883._2
1512+ let aBal = $t05078950883._3
1513+ let bBal = $t05078950883._4
1514+ let shareId = $t05078950883._5
14931515 if ((0 > inFeeNoLoan))
14941516 then throw("inFeeNoLoan must be greater than 0")
14951517 else if ((0 > inFeeLoan))
14961518 then throw("inFeeLoan must be greater than 0")
14971519 else if ((0 > capFeeNoLoan))
14981520 then throw("capFeeNoLoan must be greater than 0")
14991521 else if ((0 > capFeeWithLoan))
15001522 then throw("capFeeWithLoan must be greater than 0")
15011523 else if ((0 > stoplossFeeNoLoan))
15021524 then throw("stoplossFeeNoLoan must be greater than 0")
15031525 else if ((0 > stoplossFeeWithLoan))
15041526 then throw("stoplossFeeWithLoan must be greater than 0")
15051527 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)]
15061528 }))
15071529
15081530
15091531
15101532 @Callable(i)
15111533 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
15121534 then throw(("Can't find pool with addr " + poolAddr))
15131535 else if ((0 > inFeeNoLoan))
15141536 then throw("inFeeNoLoan must be greater than 0")
15151537 else if ((0 > inFeeLoan))
15161538 then throw("inFeeLoan must be greater than 0")
15171539 else if ((0 > capFeeNoLoan))
15181540 then throw("capFeeNoLoan must be greater than 0")
15191541 else if ((0 > capFeeWithLoan))
15201542 then throw("capFeeWithLoan must be greater than 0")
15211543 else if ((0 > stoplossFeeNoLoan))
15221544 then throw("stoplossFeeNoLoan must be greater than 0")
15231545 else if ((0 > stoplossFeeWithLoan))
15241546 then throw("stoplossFeeWithLoan must be greater than 0")
15251547 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)]))
15261548
15271549
15281550
15291551 @Callable(i)
15301552 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
15311553 then throw("dApp already active")
15321554 else [BooleanEntry(kActive, true)])
15331555
15341556
15351557
15361558 @Callable(i)
15371559 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
15381560 then throw("dApp already shutdown")
15391561 else [BooleanEntry(kActive, false)])
15401562
15411563
15421564
15431565 @Callable(i)
15441566 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
15451567 then throw("dApp already active for users")
15461568 else [BooleanEntry(kActiveUsers, true)])
15471569
15481570
15491571
15501572 @Callable(i)
15511573 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
15521574 then throw("dApp already shutdown for users")
15531575 else [BooleanEntry(kActiveUsers, false)])
15541576
15551577
15561578
15571579 @Callable(i)
15581580 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
15591581 then throw("SWOPFI already active")
15601582 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
15611583
15621584
15631585
15641586 @Callable(i)
15651587 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
15661588 then throw("SWOPFI already shutdown")
15671589 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
15681590
15691591
15701592
15711593 @Callable(i)
15721594 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
15731595 then throw("WX already active")
15741596 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
15751597
15761598
15771599
15781600 @Callable(i)
15791601 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
15801602 then throw("WX already shutdown")
15811603 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
15821604
15831605
15841606
15851607 @Callable(i)
15861608 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
15871609 then throw("Unknown pool")
15881610 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
15891611 then throw("Pool already active")
15901612 else [BooleanEntry((pool + kPoolActive), true)])
15911613
15921614
15931615
15941616 @Callable(i)
15951617 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
15961618 then throw("Unknown pool")
15971619 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
15981620 then throw("Pool already shutdown")
15991621 else [BooleanEntry((pool + kPoolActive), false)])
16001622
16011623
16021624 @Verifier(tx)
16031625 func verify () = match tx {
16041626 case inv: InvokeScriptTransaction =>
16051627 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
16061628 let isRightFee = if ((inv.fee == 900000))
16071629 then (inv.feeAssetId == unit)
16081630 else false
16091631 let isInitCall = (inv.function == "init")
16101632 let isnoPayments = (size(inv.payments) == 0)
16111633 if (if (if (isRightFee)
16121634 then isInitCall
16131635 else false)
16141636 then isSelf
16151637 else false)
16161638 then isnoPayments
16171639 else false
16181640 case _ =>
16191641 let group1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
16201642 then 1
16211643 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin2PK))
16221644 then 1
16231645 else 0))
16241646 let group2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin1PK))
16251647 then 1
16261648 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin2PK))
16271649 then 1
16281650 else 0))
16291651 ((group1Signed + group2Signed) == 2)
16301652 }
16311653

github/deemru/w8io/169f3d6 
487.96 ms