tx · GWpdBd4ApUHb9hrnHodmPKcjPoY3kbHHS79VzPKegSVx

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.05600000 Waves

2023.08.03 13:10 [3759899] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "GWpdBd4ApUHb9hrnHodmPKcjPoY3kbHHS79VzPKegSVx", "fee": 5600000, "feeAssetId": null, "timestamp": 1691057355945, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "my8dLMsmGKgFo2iU1cxRYW5phUtPbvKznEFw1LDwV24ixJ4nyiUd1HFokjHQYXgafahPgLYFGhKuQ5UnoSpy7T4", "3YH6ygi9aJJtTPDd2uf97X7c1L3PA6ndtF8uEAYqjj4K6tVHx4tfzn48uEJcSxMWXca5tqqLhvqWEB4hPiUY5htq" ], "script": "base64:BgKxAQgCEgMKAQgSBAoCCAgSBQoDCBgYEgUKAwgBCBIECgIIARIGCgQBCAgBEgUKAwEICBIPCg0ICAgICAgICAgICAgIEgMKAQgSAwoBCBIFCgMICAESBgoECAEICBINCgsICAEEERgYGAEBGBIJCgcICAEECAEYEg0KCwgIAQQYGBgYGAEYEgUKAwgEARILCgkICAEBAQEBAQQSABIAEgASABIAEgASABIAEgMKAQgSAwoBCIEBAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAKa1Bvb2xUb3RhbAIKX3Bvb2xUb3RhbAAOa1Bvb2xUb3RhbExvYW4CDl9wb29sVG90YWxMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4ADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAKa1NoYXJlUG9vbAIMX3Bvb2xTaGFyZUlkAA5rUG9vbENhcENoYW5nZQIOX3Bvb2xDYXBDaGFuZ2UAD2tUb2tlbkxhc3RQcmljZQIKbGFzdF9wcmljZQAOa1ByaWNlSW5PcmFjbGUCB190d2FwNUIAB2tBY3RpdmUCBmFjdGl2ZQAMa0FjdGl2ZVVzZXJzAgthY3RpdmVVc2VycwALa0FjdGl2ZVNGV1gCB19hY3RpdmUAC2tQb29sQWN0aXZlAgtfYWN0aXZlUG9vbAANa1VzZXJTdG9wTG9zcwIJX3N0b3BMb3NzAAlrTW9uZXlCb3gCDmF4bHlfbW9uZXlfYm94AA5rU0ZGYXJtaW5nQWRkcgITc3dvcGZpX2Zhcm1pbmdfYWRkcgAMa0xlbmRTZXJ2aWNlAhFsZW5kX3NlcnZpY2VfYWRkcgAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAHa1N3b3BJZAIHc3dvcF9pZAAFa1d4SWQCBXd4X2lkAA9rR3JvdXAxQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAPa0dyb3VwMUFkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkAD2tHcm91cDJBZG1pbjFQSwIVZ3JvdXAyX2FkbWluMV9wdWJfa2V5AA9rR3JvdXAyQWRtaW4yUEsCFWdyb3VwMl9hZG1pbjJfcHViX2tleQAIbW9uZXlCb3gJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwULa0V4Q29udHJhY3QCHE5vIGV4Y2hhbmdlIGNvbnRyYWN0IGFkZHJlc3MAD3ByaWNlT3JhY2xlQWRkcgkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrUHJpY2VPcmFjbGUCF05vIHByaWNlIG9yYWNsZSBhZGRyZXNzAA53eFN3YXBDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGU1dPUElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQdrU3dvcElkAgpObyBzd29wIGlkAARXWElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQVrV3hJZAIITm8gd3ggaWQADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrTGVuZFNlcnZpY2UCG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgEOaXNPcGVyYXRvckNhbGwBAWkDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQtpc0FkbWluQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjFQSwYJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMlBLBQR1bml0CQACAQIoT25seSBhZG1pbiBncm91cDEgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgkBDmdldExlbmRTcnZBZGRyAAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQhpc0FjdGl2ZQADCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgYFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50ARBpc0FjdGl2ZUZvclVzZXJzAAMDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGBgcFBHVuaXQJAAIBAilEQXBwIGlzIGluYWN0aXZlIGZvciB1c2VycyBhdCB0aGlzIG1vbWVudAEMaXNQb29sQWN0aXZlAgRwb29sBHR5cGUECldYU0ZBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQR0eXBlBQtrQWN0aXZlU0ZXWAYECnBvb2xBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYDAwUKV1hTRkFjdGl2ZQUKcG9vbEFjdGl2ZQcGBwEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBEWdldFNGUG9vbEJhbGFuY2VzAQhwb29sQWRkcgkAlAoCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xBQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEJBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEIgYXNzZXQgYmFsYW5jZQERZ2V0V1hQb29sQmFsYW5jZXMDCHBvb2xBZGRyA2FJZANiSWQJAJQKAgoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYUlkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2JJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQ9nZXRQb29sQmFsYW5jZXMECHBvb2xBZGRyBHR5cGUDYUlkA2JJZAMJAAACBQR0eXBlBQdTRl9QT09MCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQJAQ91bmtub3duUG9vbFR5cGUAAQ1nZXRTRlBvb2xEYXRhAQhwb29sQWRkcgQLJHQwNzg5OTc5NDgJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFCyR0MDc4OTk3OTQ4BQskdDA3ODk5Nzk0OAQEYmFsQggFCyR0MDc4OTk3OTQ4Al8yBARiYWxBCAULJHQwNzg5OTc5NDgCXzEJAJcKBQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQUFzc2V0SWQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEJBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBQRiYWxBBQRiYWxCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFDmtTRlBvb2xTaGFyZUlkAhhDYW4ndCBnZXQgc2hhcmUgYXNzZXQgaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldFdYUG9vbERhdGEBCHBvb2xBZGRyBANjZmcKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDY2ZnBQNjZmcEA2FJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQEA2JJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABQMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQEB3NoYXJlSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAMDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhpDYW4ndCBnZXQgcG9vbCBMUCBhc3NldCBpZAQLJHQwODY0NTg3MDQJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAMJAAACBQskdDA4NjQ1ODcwNAULJHQwODY0NTg3MDQEBGJhbEIIBQskdDA4NjQ1ODcwNAJfMgQEYmFsQQgFCyR0MDg2NDU4NzA0Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUJAM0IAgUBYQUKYXNzZXRQcmljZQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZ2V0UHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIBDWdldFNoYXJlUHJpY2UBB3NoYXJlSWQEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wCIENhbid0IGZpbmQgcG9vbCBhZGRyIGJ5IHNoYXJlIGlkBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAxMTY4MjExNzQ3CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA2FJZAgFDSR0MDExNjgyMTE3NDcCXzEEA2JJZAgFDSR0MDExNjgyMTE3NDcCXzIECGFCYWxhbmNlCAUNJHQwMTE2ODIxMTc0NwJfMwQIYkJhbGFuY2UIBQ0kdDAxMTY4MjExNzQ3Al80BAdkUHJpY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYUlkBQ5rUHJpY2VJbk9yYWNsZQQHZFByaWNlQgkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2JJZAUOa1ByaWNlSW5PcmFjbGUEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQECkFQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBApCUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQOc2hhcmVQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQdzaGFyZUlkAAAAAAUERE9XTgQDc3VtCQBkAgkAawMFCGFCYWxhbmNlBQdkUHJpY2VBBQpBUHJlY2lzaW9uCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24JAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQEOZ2V0U2hhcmVQcmljZXMBCHNoYXJlSWRzCgEJZ2V0UHJpY2VzAgFhB3NoYXJlSWQJAM0IAgUBYQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCgACJGwFCHNoYXJlSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEOZ2V0Q3Vyc0VudHJpZXMEA2FJZANiSWQHc2hhcmVJZAh3QW1vdW50cwQMYXNzZXRzUHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQKc2hhcmVQcmljZQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkBAZwcmljZXMJAM4IAgkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsBQh3QW1vdW50cwkAzAgCCQELU3RyaW5nRW50cnkCBQ9rVG9rZW5MYXN0UHJpY2UJALkJAgUGcHJpY2VzAgEsBQNuaWwBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwgFcFR5cGUIcG9vbEFkZHIEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCAwkAAAIFBXBUeXBlBQdTRl9QT09MBARyZXBsCgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICIGNhbGNMUFJlcGxlbmlzaFR3b1Rva2Vuc1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQRwbXRBCQDMCAIJAKQDAQUEcG10QgUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUEcmVwbAUEcmVwbAkAlwoFCgABQAkAkQMCBQRyZXBsAAMDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQRyZXBsAAQDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQRyZXBsAAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQEMYXNzZXRJZFRvU3RyAQkAkQMCBQRyZXBsAAIKAAFACQCRAwIFBHJlcGwAAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDEzMjkyMTM1NDIJAJQKAgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgIgZXZhbHVhdGVQdXRCeUFtb3VudEFzc2V0UkVBRE9OTFkJAMwIAgUEcG10QQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgIfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQkAzAgCBQRwbXRCBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFDSR0MDEzMjkyMTM1NDIFDSR0MDEzMjkyMTM1NDIECmV2YWxQdXRJbkIIBQ0kdDAxMzI5MjEzNTQyAl8yBApldmFsUHV0SW5BCAUNJHQwMTMyOTIxMzU0MgJfMQQFbHBJbkEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAEEBWxwSW5CCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgABAwkAZgIFBWxwSW5CBQVscEluQQQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQAICQCXCgUFBHBtdEEFA3BtdAkAZQIFBHBtdEIFA3BtdAUDYklkBQVscEluQgQDcG10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgAHCQCXCgUFA3BtdAUEcG10QgkAZQIFBHBtdEEFA3BtdAUDYUlkBQVscEluQQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYIcG9vbEFkZHIFcFR5cGUEcG10QQNhSWQEcG10QgNiSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNhSWQFBHBtdEEJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2JJZAUEcG10QgUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwkAzAgCCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcEBQhwb29sQWRkcgIDcHV0CQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUECHBvb2xBZGRyBXBUeXBlA3BtdAVwbXRJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFBXBtdElkBQNwbXQFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgkAzAgCCQDMCAICATAJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFCHBvb2xBZGRyAglwdXRPbmVUa24JAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTUyMDExNTU1MQMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE1MjAxMTU1NTECXzEEBWZOYW1lCAUNJHQwMTUyMDExNTU1MQJfMgQGcGFyYW1zCAUNJHQwMTUyMDExNTU1MQJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNTk3MzE2Mjc5AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE1OTczMTYyNzkCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNTk3MzE2Mjc5Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxNzAxOTE3MDU4CQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxNzAxOTE3MDU4Al8xBAVwckZlZQgFDSR0MDE3MDE5MTcwNTgCXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTcwOTgxNzQwNgMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTcwOTgxNzQwNgJfMQQKYXNzZXRUb1BheQgFDSR0MDE3MDk4MTc0MDYCXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0AwkAAAIFBXBUeXBlBQdTRl9QT09MBA0kdDAxNzc1MzE3ODc1CQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDE3NzUzMTc4NzUCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMTc3NTMxNzg3NQJfMgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtb3VudFRva2VuVG9HZXQFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxODA3NTE4MTk3CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDE4MDc1MTgxOTcCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMTgwNzUxODE5NwJfMgkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCBRBhbW91bnRUb2tlblRvR2V0CQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAkBD3Vua25vd25Qb29sVHlwZQABGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAhwb29sQWRkcgVwVHlwZQdzaGFyZUlkD3VzZXJDYW5XaXRoZHJhdwQNJHQwMTg0ODQxODk0OAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICEHdpdGhkcmF3UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDaW52BQNpbnYJAJQKAgoAAUAJAJEDAgUDaW52AAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQNpbnYAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgITZXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAxODQ4NDE4OTQ4Al8xBAdhbW91bnRCCAUNJHQwMTg0ODQxODk0OAJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDE5MzE2MTkzOTUJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMTkzMTYxOTM5NQJfMQQDYklkCAUNJHQwMTkzMTYxOTM5NQJfMgQEYUJhbAgFDSR0MDE5MzE2MTkzOTUCXzMEBGJCYWwIBQ0kdDAxOTMxNjE5Mzk1Al80BARscElkCAUNJHQwMTkzMTYxOTM5NQJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQoFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkBA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDE5OTkzMjA0MDkDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIwMDU5MjAxNzUJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBQVwVHlwZQUIcG9vbEFkZHIFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMDA1OTIwMTc1Al8xBAZwbXRJbkIIBQ0kdDAyMDA1OTIwMTc1Al8yBAZjaGFuZ2UIBQ0kdDAyMDA1OTIwMTc1Al8zBAhjaGFuZ2VJZAgFDSR0MDIwMDU5MjAxNzUCXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMTk5OTMyMDQwOQJfMQQIY2hhbmdlSWQIBQ0kdDAxOTk5MzIwNDA5Al8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAEBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCARwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbgQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBA0kdDAyMTI2NjIxNTA0AwUId2l0aExvYW4JAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50CQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgUPdG90YWxBbW91bnRMb2FuBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyMTI2NjIxNTA0Al8xBBN0b3RhbFN0YWtlZFdpdGhMb2FuCAUNJHQwMjEyNjYyMTUwNAJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgUTdG90YWxTdGFrZWRXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBDmV4Y2hhbmdlS2VlcGVyCgd0b1Rva2VuCXBtdEFtb3VudAhwbXRBc3NldAlhbW91bnRzSW4JYWRkcmVzc2VzD2Fzc2V0c1RvUmVjZWl2ZQtlc3RSZWNlaXZlZBFzbGlwcGFnZVRvbGVyYW5jZQttaW5SZWNlaXZlZAdvcHRpb25zBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA2ludgkA/AcEBQpleENvbnRyYWN0AgRzd2FwCQDMCAIFCWFtb3VudHNJbgkAzAgCBQlhZGRyZXNzZXMJAMwIAgUPYXNzZXRzVG9SZWNlaXZlCQDMCAIFC2VzdFJlY2VpdmVkCQDMCAIFEXNsaXBwYWdlVG9sZXJhbmNlCQDMCAIFC21pblJlY2VpdmVkCQDMCAIFB29wdGlvbnMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIcG10QXNzZXQFCXBtdEFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5leGNoYW5nZVB1enpsZQYHdG9Ub2tlbglwbXRBbW91bnQIcG10QXNzZXQJcm91dGVzU3RyDG1pblRvUmVjZWl2ZQdvcHRpb25zBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA2ludgkA/AcEBQpleENvbnRyYWN0AgpwdXp6bGVTd2FwCQDMCAIFCXJvdXRlc1N0cgkAzAgCBQxtaW5Ub1JlY2VpdmUJAMwIAgUHb3B0aW9ucwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhwbXRBc3NldAUJcG10QW1vdW50BQNuaWwDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmV4Y2hhbmdlU3dvcEZpCgd0b1Rva2VuCXBtdEFtb3VudAhwbXRBc3NldApleGNoYW5nZXJzDmV4Y2hhbmdlcnNUeXBlBWFyZ3MxBWFyZ3MyEXJvdXRpbmdBc3NldHNLZXlzEm1pbkFtb3VudFRvUmVjZWl2ZQdvcHRpb25zBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA2ludgkA/AcEBQpleENvbnRyYWN0Agpzd29wZmlTd2FwCQDMCAIFCmV4Y2hhbmdlcnMJAMwIAgUOZXhjaGFuZ2Vyc1R5cGUJAMwIAgUFYXJnczEJAMwIAgUFYXJnczIJAMwIAgURcm91dGluZ0Fzc2V0c0tleXMJAMwIAgUSbWluQW1vdW50VG9SZWNlaXZlCQDMCAIFB29wdGlvbnMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIcG10QXNzZXQFCXBtdEFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQpjYXBpdGFsaXplBARwb29sBXBUeXBlB3Rva2VuSWQLdG9rZW5BbW91bnQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQNJHQwMjM4NTgyMzkyNAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANBSWQIBQ0kdDAyMzg1ODIzOTI0Al8xBANCSWQIBQ0kdDAyMzg1ODIzOTI0Al8yBARiYWxBCAUNJHQwMjM4NTgyMzkyNAJfMwQEYmFsQggFDSR0MDIzODU4MjM5MjQCXzQEB3NoYXJlSWQIBQ0kdDAyMzg1ODIzOTI0Al81AwMJAQIhPQIFB3Rva2VuSWQFA0FJZAkBAiE9AgUHdG9rZW5JZAUDQklkBwkAAgECC1dyb25nIGFzc2V0BBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQLbG9hblBlcmNlbnQJAGsDBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FBlNDQUxFOAUQdG90YWxTaGFyZUFtb3VudAQQdG9rZW5zRm9yRmVlTG9hbgkAawMFC3Rva2VuQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BBJ0b2tlbnNGb3JGZWVOb0xvYW4JAGUCBQt0b2tlbkFtb3VudAUQdG9rZW5zRm9yRmVlTG9hbgQLYXhseUZlZUxvYW4JAGsDBRB0b2tlbnNGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQNYXhseUZlZU5vTG9hbgkAawMFEnRva2Vuc0ZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEB2F4bHlGZWUJAGQCBQtheGx5RmVlTG9hbgUNYXhseUZlZU5vTG9hbgQNJHQwMjQ1NjQyNDY2NAMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlAAAJAJQKAgAACQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUEBHBtdEEIBQ0kdDAyNDU2NDI0NjY0Al8xBARwbXRCCAUNJHQwMjQ1NjQyNDY2NAJfMgQNJHQwMjQ2NjcyNDc3MQkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQZOT19GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAxzdGFrZWRBbW91bnQIBQ0kdDAyNDY2NzI0NzcxAl8xBAJuZggFDSR0MDI0NjY3MjQ3NzECXzIEE2N1clBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBVjdXJQb29sSW50ZXJlc3ROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAECnN0YWtlZExvYW4JAGsDBQxzdGFrZWRBbW91bnQFC2xvYW5QZXJjZW50BQZTQ0FMRTgEDHN0YWtlZE5vTG9hbgkAZQIFDHN0YWtlZEFtb3VudAUKc3Rha2VkTG9hbgQPbmV3SW50ZXJlc3RMb2FuAwkAZgIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUTY3VyUG9vbEludGVyZXN0TG9hbgkAawMFCnN0YWtlZExvYW4FB1NDQUxFMTAFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAABBFuZXdJbnRlcmVzdE5vTG9hbgMJAGYCCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRVjdXJQb29sSW50ZXJlc3ROb0xvYW4JAGsDBQxzdGFrZWROb0xvYW4FB1NDQUxFMTAJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuBQ9uZXdJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgURbmV3SW50ZXJlc3ROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFEHRvdGFsU2hhcmVBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUKc3Rha2VkTG9hbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUHYXhseUZlZQkA2QQBBQd0b2tlbklkBQNuaWwJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkBQNuaWwBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQEdXNlcgRwb29sBXBvc0lkCGJvcnJvd2VkBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAx1c2VySW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0BAxwb29sSW50ZXJlc3QDBQhib3Jyb3dlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuCQBkAgUHcEFtb3VudAkAawMFB3BBbW91bnQJAGUCBQxwb29sSW50ZXJlc3QFDHVzZXJJbnRlcmVzdAUHU0NBTEUxMAEPY2FsY1N0b3BMb3NzRmVlBARwb29sCmlzQm9ycm93ZWQIc3RvcExvc3MKbHBXaXRoZHJhdwQHZmVlVHlwZQMFCmlzQm9ycm93ZWQFDVNUT1BMT1NTX0xPQU4FFFNUT1BMT1NTX0ZFRV9OT19MT0FOAwUIc3RvcExvc3MJAGsDBQpscFdpdGhkcmF3CQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYAAAEOd2l0aGRyYXdUb1VzZXIEBHVzZXIEcG9vbAVwb3NJZAhzdG9wTG9zcwQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQKaXNCb3Jyb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAAAAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBXBvc0lkBQppc0JvcnJvd2VkBA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwMjczMDIyNzM3NAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDAyNzMwMjI3Mzc0Al8xBAZpZEJTdHIIBQ0kdDAyNzMwMjI3Mzc0Al8yBARiYWxBCAUNJHQwMjczMDIyNzM3NAJfMwQEYmFsQggFDSR0MDI3MzAyMjczNzQCXzQEB3NoYXJlSWQIBQ0kdDAyNzMwMjI3Mzc0Al81BA0kdDAyNzM3NzI3NDQ0CQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDAyNzM3NzI3NDQ0Al8xBANpZEIIBQ0kdDAyNzM3NzI3NDQ0Al8yBAtzdG9wTG9zc0ZlZQkBD2NhbGNTdG9wTG9zc0ZlZQQFBHBvb2wFCmlzQm9ycm93ZWQFCHN0b3BMb3NzBQ91c2VyQ2FuV2l0aGRyYXcEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MBANpbnYJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAULc3RvcExvc3NGZWUDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAgh3aXRoZHJhdwkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAZAIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICA2dldAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQADCQAAAgUDaW52BQNpbnYECmNCYWxBQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQpjQmFsQUFmdGVyBQpjQmFsQUFmdGVyBApjQmFsQkFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUKY0JhbEJBZnRlcgUKY0JhbEJBZnRlcgQNJHQwMjgxMzkyODIyOAkAlAoCCQBlAgUKY0JhbEFBZnRlcgULY0JhbEFCZWZvcmUJAGUCBQpjQmFsQkFmdGVyBQtjQmFsQkJlZm9yZQQNdG9rZW5zQW1vdW50QQgFDSR0MDI4MTM5MjgyMjgCXzEEDXRva2Vuc0Ftb3VudEIIBQ0kdDAyODEzOTI4MjI4Al8yBA0kdDAyODIzMTI5NDY3AwUKaXNCb3Jyb3dlZAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkCQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEC2Nsb3NlRGJ0SW52AwkAZgIFBGRlYnQAAAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAghyZXBheUZvcgkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQULYm9ycm93QXNzZXQFBGRlYnQFA25pbAAAAwkAAAIFC2Nsb3NlRGJ0SW52BQtjbG9zZURidEludgMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQCUCgIJAGUCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQUEZGVidAkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUJAJQKAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUJAGUCCQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQUEZGVidAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQ10b2tlbnNBbW91bnRBBQ10b2tlbnNBbW91bnRCBAd0b1VzZXJBCAUNJHQwMjgyMzEyOTQ2NwJfMQQHdG9Vc2VyQggFDSR0MDI4MjMxMjk0NjcCXzIEFHBvb2xUb3RhbExvYW5FbnRyaWVzAwUKaXNCb3Jyb3dlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZQIJAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFA25pbAUDbmlsBAdlbnRyaWVzCQDOCAIJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyUG9zaXRpb25Qb29sCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgUHdG9Vc2VyQQUDaWRBCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJCBQNpZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3N0b3BMb3NzRmVlCQDZBAEFB3NoYXJlSWQFA25pbAUUcG9vbFRvdGFsTG9hbkVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwJAJQKAgUHZW50cmllcwkAzAgCBQd0b1VzZXJBCQDMCAIFB3RvVXNlckIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKCQCdCgsFBHVzZXIFBHBvb2wFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQdid0Fzc2V0BQhid0Ftb3VudAEQY2FsY0JvcnJvd0Ftb3VudAYEcG10QQRwbXRCA2FJZANiSWQIbGV2ZXJhZ2UIYm9ycm93SWQDAwkBAiE9AgUIYm9ycm93SWQFA2FJZAkBAiE9AgUIYm9ycm93SWQFA2JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEB2RQcmljZUEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNhSWQFDmtQcmljZUluT3JhY2xlBAdkUHJpY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYklkBQ5rUHJpY2VJbk9yYWNsZQQGZGVjUHJBCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQGZGVjUHJCCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQMcGF5ZEluRG9sbGFyCQBkAgkAawMFB2RQcmljZUEFBHBtdEEFBmRlY1ByQQkAawMFB2RQcmljZUIFBHBtdEIFBmRlY1ByQgQNJHQwMzE0NDkzMTU0NgMJAAACBQhib3Jyb3dJZAUDYUlkCQCUCgIFB2RQcmljZUEFBmRlY1ByQQkAlAoCBQdkUHJpY2VCBQZkZWNQckIEC2JvcnJvd1ByaWNlCAUNJHQwMzE0NDkzMTU0NgJfMQQLYm9ycm93RGVjUHIIBQ0kdDAzMTQ0OTMxNTQ2Al8yCQBrAwkAawMFDHBheWRJbkRvbGxhcgkAZQIFCGxldmVyYWdlAGQAZAULYm9ycm93RGVjUHIFC2JvcnJvd1ByaWNlARJwYXJzZVJlcGxlbmlzaFBtdHMDBHBtdHMDQUlkA0JJZAMJAAACCQCQAwEFBHBtdHMAAgMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBBAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAQdhc3NldElkBQNCSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEIJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAgJAJEDAgUEcG10cwABBmFtb3VudAMJAAACCQCQAwEFBHBtdHMAAQMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50AAADCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNCSWQJAJQKAgAACAkAkQMCBQRwbXRzAAAGYW1vdW50CQACAQINV3JvbmcgcGF5bWVudAkAAgECHE9uZSBvciB0d28gcGF5bWVudHMgZXhwZWN0ZWQBD2NhbGNQcmljZUltcGFjdAQEYmFsQQRiYWxCB25ld0JhbEEHbmV3QmFsQgQDcHJpCQBoAgkAZQIFBlNDQUxFOAkAawMJAGsDBQRiYWxCBQZTQ0FMRTgFBGJhbEEFBlNDQUxFOAkAawMFB25ld0JhbEIFBlNDQUxFOAUHbmV3QmFsQQBkAwkAZgIAAAUDcHJpCQBoAgUDcHJpAP///////////wEFA3ByaQERY2xhaW1BbmRDaGVja0FtbnQFBHBvb2wFcFR5cGUFY2xhaW0GYW1vdW50BmNoYW5nZQQNJHQwMzI1NDYzMjgwNQMFBWNsYWltCQELY2xhaW1GYXJtZWQCBQVwVHlwZQUEcG9vbAQMY2xhaW1lZEFzc2V0AwkAAAIFBXBUeXBlBQdTRl9QT09MBQZTV09QSUQDCQAAAgUFcFR5cGUFB1dYX1BPT0wFBFdYSUQJAQ91bmtub3duUG9vbFR5cGUACQCUCgIFBmFtb3VudAUMY2xhaW1lZEFzc2V0BAtjbGFpbUFtb3VudAgFDSR0MDMyNTQ2MzI4MDUCXzEECmNsYWltQXNzZXQIBQ0kdDAzMjU0NjMyODA1Al8yBANiYWwJAQ5hY2NvdW50QmFsYW5jZQEFCmNsYWltQXNzZXQDAwkAZgIFBmFtb3VudAkAZAIFC2NsYWltQW1vdW50BQZjaGFuZ2UGCQBmAgUGYW1vdW50BQNiYWwJAAIBAhlUbyBiaWcgYW1vdW50IHRvIGV4Y2hhbmdlCQCUCgIFC2NsYWltQW1vdW50BQpjbGFpbUFzc2V0GwFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEXZ2V0VXNlclBvc2l0aW9uUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDAzMzc2NzMzODM3BQFhBAl3QW1vdW50c0EIBQ0kdDAzMzc2NzMzODM3Al8xBAl3QW1vdW50c0IIBQ0kdDAzMzc2NzMzODM3Al8yBAVkZWJ0cwgFDSR0MDMzNzY3MzM4MzcCXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzM3NjczMzgzNwJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzMzc2NzMzODM3Al81BAVpbmRleAgFDSR0MDMzNzY3MzM4MzcCXzYDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFDWtVc2VyUG9zaXRpb24JAJgKBgkAzQgCBQl3QW1vdW50c0EAAAkAzQgCBQl3QW1vdW50c0IAAAkAzQgCBQVkZWJ0cwAACQDNCAIFC2VxV0Ftb3VudHNBAAAJAM0IAgULZXFXQW1vdW50c0IAAAkAZAIFBWluZGV4AAEEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNDExNjM0MjA2CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM0MTE2MzQyMDYCXzEEA0JJZAgFDSR0MDM0MTE2MzQyMDYCXzIEBGJhbEEIBQ0kdDAzNDExNjM0MjA2Al8zBARiYWxCCAUNJHQwMzQxMTYzNDIwNgJfNAQHc2hhcmVJZAgFDSR0MDM0MTE2MzQyMDYCXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAQNJHQwMzQ0MjIzNDU0MgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcECHdBbW91bnRBCAUNJHQwMzQ0MjIzNDU0MgJfMQQId0Ftb3VudEIIBQ0kdDAzNDQyMjM0NTQyAl8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAGYCBQRkZWJ0BQh3QW1vdW50QQcJAGUCBQRkZWJ0BQh3QW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFA0JJZAkAZgIFBGRlYnQFCHdBbW91bnRCBwkAZQIFBGRlYnQFCHdBbW91bnRCAAAEC2Ftb3VudFRvUGF5AwkAZgIFDWFtb3VudFRvR2V0RXgAAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yAwkAAAIFBXBUeXBlBQdXWF9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIJAQ91bmtub3duUG9vbFR5cGUAAAAEDSR0MDM1NDU0MzU2NzMDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAlAoCCQBlAgkAZAIFCHdBbW91bnRBBQ1hbW91bnRUb0dldEV4BQRkZWJ0CQBlAgUId0Ftb3VudEIFC2Ftb3VudFRvUGF5CQCUCgIJAGUCBQh3QW1vdW50QQULYW1vdW50VG9QYXkJAGUCCQBkAgUId0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFBGRlYnQECmVxV0Ftb3VudEEIBQ0kdDAzNTQ1NDM1NjczAl8xBAplcVdBbW91bnRCCAUNJHQwMzU0NTQzNTY3MwJfMgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAzQgCBQVkZWJ0cwUEZGVidAkAzQgCBQtlcVdBbW91bnRzQQUKZXFXQW1vdW50QQkAzQgCBQtlcVdBbW91bnRzQgUKZXFXQW1vdW50QgkAZAIFBWluZGV4AAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIFBWRlYnRzCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAZAIFBWluZGV4AAEEDSR0MDM1OTI4MzYwMzkKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VzZXJQb3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQJd0Ftb3VudHNBCAUNJHQwMzU5MjgzNjAzOQJfMQQJd0Ftb3VudHNCCAUNJHQwMzU5MjgzNjAzOQJfMgQFZGVidHMIBQ0kdDAzNTkyODM2MDM5Al8zBAtlcVdBbW91bnRzQQgFDSR0MDM1OTI4MzYwMzkCXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzU5MjgzNjAzOQJfNQkAlAoCBQNuaWwJAJcKBQUJd0Ftb3VudHNBBQl3QW1vdW50c0IFBWRlYnRzBQtlcVdBbW91bnRzQQULZXFXQW1vdW50c0IBaQEJcmVwbGVuaXNoAwRwb29sCGxldmVyYWdlCGJvcnJvd0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwAwMJAQEhAQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhbkJvcnJvdwkAZgIFCGxldmVyYWdlAGQHCQACAQIdWW91IGNhbid0IGJvcnJvdyBpbiB0aGlzIHBvb2wEDSR0MDM2NjM3MzY3MjcJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzY2MzczNjcyNwJfMQQDQklkCAUNJHQwMzY2MzczNjcyNwJfMgQEYmFsQQgFDSR0MDM2NjM3MzY3MjcCXzMEBGJhbEIIBQ0kdDAzNjYzNzM2NzI3Al80BAdzaGFyZUlkCAUNJHQwMzY2MzczNjcyNwJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwMzY4MDgzNjg2NwkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDM2ODA4MzY4NjcCXzEEBHBtdEIIBQ0kdDAzNjgwODM2ODY3Al8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDAzNzg1NjM3OTUwCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzNzg1NjM3OTUwBQ0kdDAzNzg1NjM3OTUwBAduZXdCYWxCCAUNJHQwMzc4NTYzNzk1MAJfMgQHbmV3QmFsQQgFDSR0MDM3ODU2Mzc5NTACXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzgwMjAzODEzNQkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM4MDIwMzgxMzUCXzEECHdBbW91bnRCCAUNJHQwMzgwMjAzODEzNQJfMgkAlAoCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzgxODgzODMwMwkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQDCQAAAgUNJHQwMzgxODgzODMwMwUNJHQwMzgxODgzODMwMwQHYXhseUZlZQgFDSR0MDM4MTg4MzgzMDMCXzIECnVzZXJTdGFrZWQIBQ0kdDAzODE4ODM4MzAzAl8xBA0kdDAzODMwOTM4NDAzCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzODMwOTM4NDAzBQ0kdDAzODMwOTM4NDAzBAduZXdCYWxCCAUNJHQwMzgzMDkzODQwMwJfMgQHbmV3QmFsQQgFDSR0MDM4MzA5Mzg0MDMCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzg0NzMzODU4OAkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM4NDczMzg1ODgCXzEECHdBbW91bnRCCAUNJHQwMzg0NzMzODU4OAJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCAUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBAkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHAWkBFGNyZWF0ZVVwZGF0ZVN0b3BMb3NzBAVwb3NJZAZwb29sSWQHYXNzZXRJZAVwcmljZQkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGcG9vbElkAgFfCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAAgECGlRoZXJlIGFyZSBubyB1c2VyIHBvc2l0aW9uAwkAZwIAAAUFcHJpY2UJAAIBAhxQcmljZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIFBXByaWNlBRB0b2tlbk9yYWNsZVByaWNlCQACAQIrUHJpY2UgbXVzdCBiZSBsZXNzIHRoYW4gY3VycmVudCB0b2tlbiBwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQVwcmljZQUDbmlsAWkBDmRlbGV0ZVN0b3BMb3NzAwVwb3NJZAZwb29sSWQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCQACAQIITm8gZW50cnkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQNuaWwBaQEEaW5pdA0MbW9uZXlCb3hBZGRyDXNmRmFybWluZ0FkZHIIbGVuZEFkZHIPcHJpY2VPcmFjbGVBZGRyEGtlZXBlckV4Q29udHJhY3QOd3hTd2FwQ29udHJhY3QLc3dvcEFzc2V0SWQJd3hBc3NldElkDm9wZXJhdG9yUHViS2V5Emdyb3VwMUFkbWluMVB1YktleRJncm91cDFBZG1pbjJQdWJLZXkSZ3JvdXAyQWRtaW4xUHViS2V5Emdyb3VwMkFkbWluMlB1YktleQkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAKIIAQUPa09wZXJhdG9yQ2FsbFBLCQACAQIOQWxyZWFkeSBpbml0ZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDG1vbmV5Qm94QWRkcgkAAgECI21vbmV5Qm94QWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ1zZkZhcm1pbmdBZGRyCQACAQIkc2ZGYXJtaW5nQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQhsZW5kQWRkcgkAAgECH2xlbmRBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFD3ByaWNlT3JhY2xlQWRkcgkAAgECJnByaWNlT3JhY2xlQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRBrZWVwZXJFeENvbnRyYWN0CQACAQIna2VlcGVyRXhDb250cmFjdCBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFC3N3b3BBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQUJd3hBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQECIT0CCQDIAQEJANkEAQUOb3BlcmF0b3JQdWJLZXkAIAkAAgECHW9wZXJhdG9yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtNb25leUJveAUMbW9uZXlCb3hBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtTRkZhcm1pbmdBZGRyBQ1zZkZhcm1pbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtMZW5kU2VydmljZQUIbGVuZEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa1ByaWNlT3JhY2xlBQ9wcmljZU9yYWNsZUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa0V4Q29udHJhY3QFEGtlZXBlckV4Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1d4U3dhcENvbnRyYWN0BQ53eFN3YXBDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQdrU3dvcElkBQtzd29wQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQVrV3hJZAUJd3hBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tPcGVyYXRvckNhbGxQSwUOb3BlcmF0b3JQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMVBLBRJncm91cDFBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMlBLBRJncm91cDFBZG1pbjJQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMVBLBRJncm91cDJBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMlBLBRJncm91cDJBZG1pbjJQdWJLZXkFA25pbAFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBA0kdDA0MzQyNzQzNTMxCQEMcGFyc2VSZXF1ZXN0AQUJcmVxdWVzdElkBAR1c2VyCAUNJHQwNDM0Mjc0MzUzMQJfMQQEcG9vbAgFDSR0MDQzNDI3NDM1MzECXzIEBHBtdEEIBQ0kdDA0MzQyNzQzNTMxAl8zBANBSWQIBQ0kdDA0MzQyNzQzNTMxAl80BARwbXRCCAUNJHQwNDM0Mjc0MzUzMQJfNQQDQklkCAUNJHQwNDM0Mjc0MzUzMQJfNgQEYmFsQQgFDSR0MDQzNDI3NDM1MzECXzcEBGJhbEIIBQ0kdDA0MzQyNzQzNTMxAl84BAdzaGFyZUlkCAUNJHQwNDM0Mjc0MzUzMQJfOQQHYndBc3NldAgFDSR0MDQzNDI3NDM1MzEDXzEwBAhid0Ftb3VudAgFDSR0MDQzNDI3NDM1MzEDXzExAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA0MzcyMTQzODIxAwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNDM3MjE0MzgyMQJfMQQHcG10QWxsQggFDSR0MDQzNzIxNDM4MjECXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0MzkwMzQ0MDE4CQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQKdXNlclN0YWtlZAgFDSR0MDQzOTAzNDQwMTgCXzEEB2F4bHlGZWUIBQ0kdDA0MzkwMzQ0MDE4Al8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBA0kdDA0NDM3ODQ0NDkzCQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNDQzNzg0NDQ5MwJfMQQId0Ftb3VudEIIBQ0kdDA0NDM3ODQ0NDkzAl8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNDUwMTQ0NTEwNAkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0NTAxNDQ1MTA0Al8xBANCSWQIBQ0kdDA0NTAxNDQ1MTA0Al8yBARiYWxBCAUNJHQwNDUwMTQ0NTEwNAJfMwQEYmFsQggFDSR0MDQ1MDE0NDUxMDQCXzQEB3NoYXJlSWQIBQ0kdDA0NTAxNDQ1MTA0Al81BAZhbW91bnQJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPbGlxdWlkYXRlQW1vdW50BAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQJAGYCBQxib3Jyb3dBbW91bnQAAAMJAGYCBQ9saXF1aWRhdGVBbW91bnQFD3VzZXJDYW5XaXRoZHJhdwkAAgECJ1lvdSBjYW4ndCBsaXF1aWRhdGUgbW9yZSB0aGFuIHVzZXIgaGF2ZQMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUPdXNlckNhbldpdGhkcmF3BQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBAUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYJAJQKAgkAzQgCCAUDcmVzAl8xCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MIBQNyZXMCXzIBaQESY2FwaXRhbGl6ZUV4S2VlcGVyCwRwb29sCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCWFtb3VudHNJbglhZGRyZXNzZXMPYXNzZXRzVG9SZWNlaXZlC2VzdFJlY2VpdmVkEXNsaXBwYWdlVG9sZXJhbmNlC21pblJlY2VpdmVkB29wdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABA0kdDA0NzI1NjQ3MzU1CQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEGFtb3VudFRvRXhjaGFuZ2UFBmNoYW5nZQQNY2xhaW1lZEFtb3VudAgFDSR0MDQ3MjU2NDczNTUCXzEEDGNsYWltZWRBc3NldAgFDSR0MDQ3MjU2NDczNTUCXzIED2V4Y2hhbmdlZEFtb3VudAkBDmV4Y2hhbmdlS2VlcGVyCgUJdG9rZW5Ub0lkBRBhbW91bnRUb0V4Y2hhbmdlBQxjbGFpbWVkQXNzZXQFCWFtb3VudHNJbgUJYWRkcmVzc2VzBQ9hc3NldHNUb1JlY2VpdmUFC2VzdFJlY2VpdmVkBRFzbGlwcGFnZVRvbGVyYW5jZQULbWluUmVjZWl2ZWQFB29wdGlvbnMECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAkAAgECD05lZ2F0aXZlIGNoYW5nZQkAzggCCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBXBUeXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAULY2hhbmdlRW50cnkBaQESY2FwaXRhbGl6ZUV4UHV6emxlBwRwb29sCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCXJvdXRlc1N0cgxtaW5Ub1JlY2VpdmUHb3B0aW9ucwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEBmNoYW5nZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlAAAEDSR0MDQ4MTU1NDgyNTQJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQUGY2hhbmdlBA1jbGFpbWVkQW1vdW50CAUNJHQwNDgxNTU0ODI1NAJfMQQMY2xhaW1lZEFzc2V0CAUNJHQwNDgxNTU0ODI1NAJfMgQPZXhjaGFuZ2VkQW1vdW50CQEOZXhjaGFuZ2VQdXp6bGUGBQl0b2tlblRvSWQFEGFtb3VudFRvRXhjaGFuZ2UFDGNsYWltZWRBc3NldAUJcm91dGVzU3RyBQxtaW5Ub1JlY2VpdmUFB29wdGlvbnMECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsCQDOCAIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQFpARJjYXBpdGFsaXplRXhTd29wRmkLBHBvb2wJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0KZXhjaGFuZ2Vycw5leGNoYW5nZXJzVHlwZQVhcmdzMQVhcmdzMhFyb3V0aW5nQXNzZXRzS2V5cxJtaW5BbW91bnRUb1JlY2VpdmUHb3B0aW9ucwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEBmNoYW5nZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlAAAEDSR0MDQ5MDk5NDkxOTgJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQUGY2hhbmdlBA1jbGFpbWVkQW1vdW50CAUNJHQwNDkwOTk0OTE5OAJfMQQMY2xhaW1lZEFzc2V0CAUNJHQwNDkwOTk0OTE5OAJfMgQPZXhjaGFuZ2VkQW1vdW50CQEOZXhjaGFuZ2VTd29wRmkKBQl0b2tlblRvSWQFEGFtb3VudFRvRXhjaGFuZ2UFDGNsYWltZWRBc3NldAUKZXhjaGFuZ2VycwUOZXhjaGFuZ2Vyc1R5cGUFBWFyZ3MxBQVhcmdzMgURcm91dGluZ0Fzc2V0c0tleXMFEm1pbkFtb3VudFRvUmVjZWl2ZQUHb3B0aW9ucwQJbmV3Q2hhbmdlCQBlAgkAZAIFDWNsYWltZWRBbW91bnQFBmNoYW5nZQUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBnAgUJbmV3Q2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UFCW5ld0NoYW5nZQUDbmlsBQNuaWwJAM4IAgkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFC2NoYW5nZUVudHJ5AWkBDmNhcGl0YWxpemVOb0V4AwRwb29sBWNsYWltEWFtb3VudEZyb21CYWxhbmNlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQNJHQwNDk3OTU0OTg5MAkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRFhbW91bnRGcm9tQmFsYW5jZQAABA1jbGFpbWVkQW1vdW50CAUNJHQwNDk3OTU0OTg5MAJfMQQMY2xhaW1lZEFzc2V0CAUNJHQwNDk3OTU0OTg5MAJfMgkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAkAZAIFDWNsYWltZWRBbW91bnQFEWFtb3VudEZyb21CYWxhbmNlAWkBC2luaXROZXdQb29sCQR0eXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlBA0kdDA1MDMxNjUwNDEwCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUIcG9vbEFkZHIFBHR5cGUEA2FJZAgFDSR0MDUwMzE2NTA0MTACXzEEA2JJZAgFDSR0MDUwMzE2NTA0MTACXzIEBGFCYWwIBQ0kdDA1MDMxNjUwNDEwAl8zBARiQmFsCAUNJHQwNTAzMTY1MDQxMAJfNAQHc2hhcmVJZAgFDSR0MDUwMzE2NTA0MTACXzUDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtQb29sSW50ZXJlc3RMb2FuAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBWtQb29sBQhwb29sQWRkcgUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wFCHBvb2xBZGRyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ5rUG9vbENhbkJvcnJvdwUJY2FuQm9ycm93BQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECE2RBcHAgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGBQNuaWwBaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQIVZEFwcCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwUDbmlsAWkBEGFjdGl2YXRlRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIdZEFwcCBhbHJlYWR5IGFjdGl2ZSBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwYFA25pbAFpARBzaHV0ZG93bkZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIfZEFwcCBhbHJlYWR5IHNodXRkb3duIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBwUDbmlsAWkBCmFjdGl2YXRlU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECFVNXT1BGSSBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93blNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECF1NXT1BGSSBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBCmFjdGl2YXRlV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECEVdYIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQITV1ggYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQxhY3RpdmF0ZVBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQITUG9vbCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYFA25pbAFpAQxzaHV0ZG93blBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhVQb29sIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUHBQNuaWwBAnR4AQZ2ZXJpZnkABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDBQppc1JpZ2h0RmVlBQppc0luaXRDYWxsBwUGaXNTZWxmBwUMaXNub1BheW1lbnRzBwQMZ3JvdXAxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUOZ3JvdXAxQWRtaW4xUEsAAQkAZAIAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDmdyb3VwMUFkbWluMlBLAAEAAAQMZ3JvdXAyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUOZ3JvdXAyQWRtaW4xUEsAAQkAZAIAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDmdyb3VwMkFkbWluMlBLAAEAAAkAAAIJAGQCBQxncm91cDFTaWduZWQFDGdyb3VwMlNpZ25lZAACrYa1tQ==", "height": 3759899, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4fm5JqpwqWZWr2XUEPgD5egGx4x5Cy83i3cRb1qhvk68 Next: GhpFqZZTmz1dn2FtZ4ATDWGrQCwrtRdNFPWBBeKQSoNw Diff:
OldNewDifferences
6767
6868 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
6969
70-let kAxlyNoLoanCapFee = "_axlyFeeCapWithLoan"
70+let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7171
72-let kAxlyWithLoanCapFee = "_axlyFeeCapNoLoan"
72+let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7373
7474 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7575
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
70-let kAxlyNoLoanCapFee = "_axlyFeeCapWithLoan"
70+let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7171
72-let kAxlyWithLoanCapFee = "_axlyFeeCapNoLoan"
72+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) = {
362362 let assetPrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
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")
385385 let $t01168211747 = getPoolData(poolAddr, pType)
386386 let aId = $t01168211747._1
387387 let bId = $t01168211747._2
388388 let aBalance = $t01168211747._3
389389 let bBalance = $t01168211747._4
390390 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
391391 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
392392 let shareSupply = getShareSupply(poolAddr, pType, shareId)
393393 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
394394 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
395395 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
396396 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
397397 fraction(sum, sharePrecision, shareSupply)
398398 }
399399
400400
401401 func getSharePrices (shareIds) = {
402402 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
403403
404404 let $l = shareIds
405405 let $s = size($l)
406406 let $acc0 = nil
407407 func $f0_1 ($a,$i) = if (($i >= $s))
408408 then $a
409409 else getPrices($a, $l[$i])
410410
411411 func $f0_2 ($a,$i) = if (($i >= $s))
412412 then $a
413413 else throw("List size exceeds 20")
414414
415415 $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)
416416 }
417417
418418
419419 func getCursEntries (aId,bId,shareId,wAmounts) = {
420420 let assetsPrices = getAssetsPrice([aId, bId])
421421 let sharePrice = getSharePrice(shareId)
422422 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
423423 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
424424 }
425425
426426
427427 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
428428 then {
429429 let repl = {
430430 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
431431 if ($isInstanceOf(@, "List[Any]"))
432432 then @
433433 else throw(($getType(@) + " couldn't be cast to List[Any]"))
434434 }
435435 if ((repl == repl))
436436 then $Tuple5({
437437 let @ = repl[3]
438438 if ($isInstanceOf(@, "Int"))
439439 then @
440440 else throw(($getType(@) + " couldn't be cast to Int"))
441441 }, {
442442 let @ = repl[4]
443443 if ($isInstanceOf(@, "Int"))
444444 then @
445445 else throw(($getType(@) + " couldn't be cast to Int"))
446446 }, {
447447 let @ = repl[1]
448448 if ($isInstanceOf(@, "Int"))
449449 then @
450450 else throw(($getType(@) + " couldn't be cast to Int"))
451451 }, assetIdToStr(repl[2]), {
452452 let @ = repl[0]
453453 if ($isInstanceOf(@, "Int"))
454454 then @
455455 else throw(($getType(@) + " couldn't be cast to Int"))
456456 })
457457 else throw("Strict value is not equal to itself.")
458458 }
459459 else if ((pType == WX_POOL))
460460 then {
461461 let $t01329213542 = $Tuple2(split({
462462 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
463463 if ($isInstanceOf(@, "String"))
464464 then @
465465 else throw(($getType(@) + " couldn't be cast to String"))
466466 }, "__"), split({
467467 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
468468 if ($isInstanceOf(@, "String"))
469469 then @
470470 else throw(($getType(@) + " couldn't be cast to String"))
471471 }, "__"))
472472 if (($t01329213542 == $t01329213542))
473473 then {
474474 let evalPutInB = $t01329213542._2
475475 let evalPutInA = $t01329213542._1
476476 let lpInA = parseIntValue(evalPutInA[1])
477477 let lpInB = parseIntValue(evalPutInB[1])
478478 if ((lpInB > lpInA))
479479 then {
480480 let pmt = parseIntValue(evalPutInA[8])
481481 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
482482 }
483483 else {
484484 let pmt = parseIntValue(evalPutInB[7])
485485 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
486486 }
487487 }
488488 else throw("Strict value is not equal to itself.")
489489 }
490490 else unknownPoolType()
491491
492492
493493 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
494494 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
495495 if ((pType == SF_POOL))
496496 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
497497 else if ((pType == WX_POOL))
498498 then invoke(poolAddr, "put", [1000000, false], payments)
499499 else unknownPoolType()
500500 }
501501
502502
503503 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
504504 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
505505 if ((pType == SF_POOL))
506506 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
507507 else if ((pType == WX_POOL))
508508 then invoke(poolAddr, "putOneTkn", [0, false], payments)
509509 else unknownPoolType()
510510 }
511511
512512
513513 func stakeLP (pool,pType,shareId,amount) = {
514514 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
515515 if ((pType == SF_POOL))
516516 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
517517 else if ((pType == WX_POOL))
518518 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
519519 else unknownPoolType()
520520 }
521521
522522
523523 func unstakeLP (pool,pType,shareId,amount) = {
524524 let $t01520115551 = if ((pType == SF_POOL))
525525 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
526526 else if ((pType == WX_POOL))
527527 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
528528 else unknownPoolType()
529529 let farmAddr = $t01520115551._1
530530 let fName = $t01520115551._2
531531 let params = $t01520115551._3
532532 let inv = invoke(farmAddr, fName, params, nil)
533533 if ((inv == inv))
534534 then amount
535535 else throw("Strict value is not equal to itself.")
536536 }
537537
538538
539539 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
540540 let poolAddr = Address(fromBase58String(pool))
541541 let feeScale6 = 1000000
542542 let fee = getIntegerValue(poolAddr, kSFPoolFee)
543543 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
544544 let $t01597316279 = if ((assetTokenToGet == assetIdA))
545545 then {
546546 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
547547 $Tuple2(amountToPay, assetIdB)
548548 }
549549 else {
550550 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
551551 $Tuple2(amountToPay, assetIdA)
552552 }
553553 let amountToPay = $t01597316279._1
554554 let assetToPay = $t01597316279._2
555555 $Tuple2(assetToPay, amountToPay)
556556 }
557557
558558
559559 func getWXSwapFees (pool) = {
560560 let poolAddr = addressFromStringValue(pool)
561561 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
562562 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
563563 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
564564 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
565565 case fees: (Int, Int) =>
566566 $Tuple2(fees._1, fees._2)
567567 case _ =>
568568 $Tuple2(poolFeeDefault, protocolFeeDefault)
569569 }
570570 }
571571
572572
573573 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
574574 let $t01701917058 = getWXSwapFees(pool)
575575 let pFee = $t01701917058._1
576576 let prFee = $t01701917058._2
577577 let feeScale = toBigInt(100000000)
578578 let $t01709817406 = if ((assetTokenToGet == assetIdA))
579579 then {
580580 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
581581 $Tuple2(amountToPay, assetIdB)
582582 }
583583 else {
584584 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
585585 $Tuple2(amountToPay, assetIdA)
586586 }
587587 let amountToPay = $t01709817406._1
588588 let assetToPay = $t01709817406._2
589589 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
590590 $Tuple2(assetToPay, amountToPayWithFee)
591591 }
592592
593593
594594 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((pType == SF_POOL))
595595 then {
596596 let $t01775317875 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
597597 let assetToPay = $t01775317875._1
598598 let amountToPay = $t01775317875._2
599599 invoke(addressFromStringValue(pool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
600600 }
601601 else if ((pType == WX_POOL))
602602 then {
603603 let $t01807518197 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604604 let assetToPay = $t01807518197._1
605605 let amountToPay = $t01807518197._2
606606 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
607607 }
608608 else unknownPoolType()
609609
610610
611611 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
612612 let $t01848418948 = if ((pType == SF_POOL))
613613 then {
614614 let inv = {
615615 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
616616 if ($isInstanceOf(@, "List[Any]"))
617617 then @
618618 else throw(($getType(@) + " couldn't be cast to List[Any]"))
619619 }
620620 if ((inv == inv))
621621 then $Tuple2({
622622 let @ = inv[0]
623623 if ($isInstanceOf(@, "Int"))
624624 then @
625625 else throw(($getType(@) + " couldn't be cast to Int"))
626626 }, {
627627 let @ = inv[1]
628628 if ($isInstanceOf(@, "Int"))
629629 then @
630630 else throw(($getType(@) + " couldn't be cast to Int"))
631631 })
632632 else throw("Strict value is not equal to itself.")
633633 }
634634 else if ((pType == WX_POOL))
635635 then {
636636 let inv = split({
637637 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
638638 if ($isInstanceOf(@, "String"))
639639 then @
640640 else throw(($getType(@) + " couldn't be cast to String"))
641641 }, "__")
642642 if ((inv == inv))
643643 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
644644 else throw("Strict value is not equal to itself.")
645645 }
646646 else unknownPoolType()
647647 let amountA = $t01848418948._1
648648 let amountB = $t01848418948._2
649649 $Tuple2(amountA, amountB)
650650 }
651651
652652
653653 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
654654 then {
655655 let balBefore = accountBalance(SWOPID)
656656 if ((balBefore == balBefore))
657657 then {
658658 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
659659 if ((inv == inv))
660660 then {
661661 let balAfter = accountBalance(SWOPID)
662662 $Tuple2((balAfter - balBefore), SWOPID)
663663 }
664664 else throw("Strict value is not equal to itself.")
665665 }
666666 else throw("Strict value is not equal to itself.")
667667 }
668668 else if ((pType == WX_POOL))
669669 then {
670670 let $t01931619395 = getWXPoolData(addressFromStringValue(pool))
671671 let aId = $t01931619395._1
672672 let bId = $t01931619395._2
673673 let aBal = $t01931619395._3
674674 let bBal = $t01931619395._4
675675 let lpId = $t01931619395._5
676676 let balBefore = accountBalance(WXID)
677677 if ((balBefore == balBefore))
678678 then {
679679 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
680680 if ((inv == inv))
681681 then {
682682 let balAfter = accountBalance(WXID)
683683 $Tuple2((balAfter - balBefore), WXID)
684684 }
685685 else throw("Strict value is not equal to itself.")
686686 }
687687 else throw("Strict value is not equal to itself.")
688688 }
689689 else unknownPoolType()
690690
691691
692692 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
693693 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
694694 if ((lpBalanceBefore == lpBalanceBefore))
695695 then {
696696 let poolAddr = addressFromStringValue(pool)
697697 let $t01999320409 = if (if ((pmtA > 0))
698698 then (pmtB > 0)
699699 else false)
700700 then {
701701 let $t02005920175 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
702702 let pmtInA = $t02005920175._1
703703 let pmtInB = $t02005920175._2
704704 let change = $t02005920175._3
705705 let changeId = $t02005920175._4
706706 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
707707 if ((inv == inv))
708708 then $Tuple2(change, changeId)
709709 else throw("Strict value is not equal to itself.")
710710 }
711711 else if ((pmtA > 0))
712712 then $Tuple2(pmtA, aId)
713713 else if ((pmtB > 0))
714714 then $Tuple2(pmtB, bId)
715715 else throw("pmts must be > 0")
716716 let change = $t01999320409._1
717717 let changeId = $t01999320409._2
718718 let inv = if ((change > 0))
719719 then replenishOneTokenByType(poolAddr, pType, change, changeId)
720720 else nil
721721 if ((inv == inv))
722722 then {
723723 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
724724 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
725725 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
726726 let userShareForStake = (totalStaked - axlyFeeAmount)
727727 if ((0 >= userShareForStake))
728728 then throw("amount of staked sharetokens must be > 0")
729729 else {
730730 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
731731 if ((invLP == invLP))
732732 then $Tuple2(userShareForStake, axlyFeeAmount)
733733 else throw("Strict value is not equal to itself.")
734734 }
735735 }
736736 else throw("Strict value is not equal to itself.")
737737 }
738738 else throw("Strict value is not equal to itself.")
739739 }
740740
741741
742742 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
743743 let totalAmount = getPoolTotalShare(pool)
744744 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
745745 let $t02126621504 = if (withLoan)
746746 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
747747 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
748748 let curPoolInterest = $t02126621504._1
749749 let totalStakedWithLoan = $t02126621504._2
750750 [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))]
751751 }
752752
753753
754754 func exchangeKeeper (toToken,pmtAmount,pmtAsset,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
755755 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
756756 if ((tokenBalanceBefore == tokenBalanceBefore))
757757 then {
758758 let inv = invoke(exContract, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [AttachedPayment(pmtAsset, pmtAmount)])
759759 if ((inv == inv))
760760 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
761761 else throw("Strict value is not equal to itself.")
762762 }
763763 else throw("Strict value is not equal to itself.")
764764 }
765765
766766
767767 func exchangePuzzle (toToken,pmtAmount,pmtAsset,routesStr,minToReceive,options) = {
768768 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
769769 if ((tokenBalanceBefore == tokenBalanceBefore))
770770 then {
771771 let inv = invoke(exContract, "puzzleSwap", [routesStr, minToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
772772 if ((inv == inv))
773773 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
774774 else throw("Strict value is not equal to itself.")
775775 }
776776 else throw("Strict value is not equal to itself.")
777777 }
778778
779779
780780 func exchangeSwopFi (toToken,pmtAmount,pmtAsset,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
781781 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
782782 if ((tokenBalanceBefore == tokenBalanceBefore))
783783 then {
784784 let inv = invoke(exContract, "swopfiSwap", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
785785 if ((inv == inv))
786786 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
787787 else throw("Strict value is not equal to itself.")
788788 }
789789 else throw("Strict value is not equal to itself.")
790790 }
791791
792792
793793 func capitalize (pool,pType,tokenId,tokenAmount) = {
794794 let poolAddr = Address(fromBase58String(pool))
795795 let $t02385823924 = getPoolData(poolAddr, pType)
796796 let AId = $t02385823924._1
797797 let BId = $t02385823924._2
798798 let balA = $t02385823924._3
799799 let balB = $t02385823924._4
800800 let shareId = $t02385823924._5
801801 if (if ((tokenId != AId))
802802 then (tokenId != BId)
803803 else false)
804804 then throw("Wrong asset")
805805 else {
806806 let totalShareAmount = getPoolTotalShare(pool)
807807 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
808808 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
809809 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
810810 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
811811 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
812812 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
813813 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
814814 let $t02456424664 = if ((tokenId == AId))
815815 then $Tuple2((tokenAmount - axlyFee), 0)
816816 else $Tuple2(0, (tokenAmount - axlyFee))
817817 let pmtA = $t02456424664._1
818818 let pmtB = $t02456424664._2
819819 let $t02466724771 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
820820 let stakedAmount = $t02466724771._1
821821 let nf = $t02466724771._2
822822 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
823823 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
824824 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
825825 let stakedNoLoan = (stakedAmount - stakedLoan)
826826 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
827827 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
828828 else 0
829829 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
830830 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
831831 else 0
832832 ([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))
833833 }
834834 }
835835
836836
837837 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
838838 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
839839 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
840840 let poolInterest = if (borrowed)
841841 then getIntegerValue(this, (pool + kPoolInterestLoan))
842842 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
843843 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
844844 }
845845
846846
847847 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
848848 let feeType = if (isBorrowed)
849849 then STOPLOSS_LOAN
850850 else STOPLOSS_FEE_NO_LOAN
851851 if (stopLoss)
852852 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
853853 else 0
854854 }
855855
856856
857857 func withdrawToUser (user,pool,posId,stopLoss) = {
858858 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
859859 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
860860 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
861861 let poolTotalShare = getPoolTotalShare(pool)
862862 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
863863 let userAddr = Address(fromBase58String(user))
864864 let poolAddr = Address(fromBase58String(pool))
865865 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
866866 let $t02730227374 = getPoolData(poolAddr, pType)
867867 let idAStr = $t02730227374._1
868868 let idBStr = $t02730227374._2
869869 let balA = $t02730227374._3
870870 let balB = $t02730227374._4
871871 let shareId = $t02730227374._5
872872 let $t02737727444 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
873873 let idA = $t02737727444._1
874874 let idB = $t02737727444._2
875875 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
876876 let cBalABefore = accountBalance(idA)
877877 if ((cBalABefore == cBalABefore))
878878 then {
879879 let cBalBBefore = accountBalance(idB)
880880 if ((cBalBBefore == cBalBBefore))
881881 then {
882882 let inv = if ((pType == SF_POOL))
883883 then {
884884 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
885885 if ((inv == inv))
886886 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
887887 else throw("Strict value is not equal to itself.")
888888 }
889889 else if ((pType == WX_POOL))
890890 then {
891891 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
892892 if ((inv == inv))
893893 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
894894 else throw("Strict value is not equal to itself.")
895895 }
896896 else unknownPoolType()
897897 if ((inv == inv))
898898 then {
899899 let cBalAAfter = accountBalance(idA)
900900 if ((cBalAAfter == cBalAAfter))
901901 then {
902902 let cBalBAfter = accountBalance(idB)
903903 if ((cBalBAfter == cBalBAfter))
904904 then {
905905 let $t02813928228 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
906906 let tokensAmountA = $t02813928228._1
907907 let tokensAmountB = $t02813928228._2
908908 let $t02823129467 = if (isBorrowed)
909909 then {
910910 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
911911 let debt = {
912912 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
913913 if ($isInstanceOf(@, "Int"))
914914 then @
915915 else throw(($getType(@) + " couldn't be cast to Int"))
916916 }
917917 if ((debt == debt))
918918 then {
919919 let amountToGetEx = if (if ((borrowAsset == idAStr))
920920 then (debt > tokensAmountA)
921921 else false)
922922 then (debt - tokensAmountA)
923923 else if (if ((borrowAsset == idBStr))
924924 then (debt > tokensAmountB)
925925 else false)
926926 then (debt - tokensAmountB)
927927 else 0
928928 let exInv = if ((amountToGetEx > 0))
929929 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
930930 else nil
931931 if ((exInv == exInv))
932932 then {
933933 let cBalAAfterRepay = accountBalance(idA)
934934 if ((cBalAAfterRepay == cBalAAfterRepay))
935935 then {
936936 let cBalBAfterRepay = accountBalance(idB)
937937 if ((cBalBAfterRepay == cBalBAfterRepay))
938938 then {
939939 let closeDbtInv = if ((debt > 0))
940940 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
941941 else 0
942942 if ((closeDbtInv == closeDbtInv))
943943 then if ((borrowAsset == idAStr))
944944 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
945945 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
946946 else throw("Strict value is not equal to itself.")
947947 }
948948 else throw("Strict value is not equal to itself.")
949949 }
950950 else throw("Strict value is not equal to itself.")
951951 }
952952 else throw("Strict value is not equal to itself.")
953953 }
954954 else throw("Strict value is not equal to itself.")
955955 }
956956 else $Tuple2(tokensAmountA, tokensAmountB)
957957 let toUserA = $t02823129467._1
958958 let toUserB = $t02823129467._2
959959 let poolTotalLoanEntries = if (isBorrowed)
960960 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
961961 else nil
962962 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))
963963 $Tuple2(entries, [toUserA, toUserB])
964964 }
965965 else throw("Strict value is not equal to itself.")
966966 }
967967 else throw("Strict value is not equal to itself.")
968968 }
969969 else throw("Strict value is not equal to itself.")
970970 }
971971 else throw("Strict value is not equal to itself.")
972972 }
973973 else throw("Strict value is not equal to itself.")
974974 }
975975
976976
977977 func parseRequest (requestId) = {
978978 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
979979 let user = request[0]
980980 let pool = request[1]
981981 let pmtA = parseIntValue(request[2])
982982 let AId = request[3]
983983 let pmtB = parseIntValue(request[4])
984984 let BId = request[5]
985985 let balA = parseIntValue(request[6])
986986 let balB = parseIntValue(request[7])
987987 let shareId = request[8]
988988 let bwAsset = request[9]
989989 let bwAmount = parseIntValue(request[10])
990990 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
991991 }
992992
993993
994994 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
995995 then (borrowId != bId)
996996 else false)
997997 then throw("Wrong borrow asset")
998998 else {
999999 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
10001000 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
10011001 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10021002 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10031003 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
10041004 let $t03144931546 = if ((borrowId == aId))
10051005 then $Tuple2(dPriceA, decPrA)
10061006 else $Tuple2(dPriceB, decPrB)
10071007 let borrowPrice = $t03144931546._1
10081008 let borrowDecPr = $t03144931546._2
10091009 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10101010 }
10111011
10121012
10131013 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
10141014 then if ((assetIdToStr(pmts[0].assetId) != AId))
10151015 then throw("Wrong payment asset A")
10161016 else if ((assetIdToStr(pmts[1].assetId) != BId))
10171017 then throw("Wrong payment asset B")
10181018 else $Tuple2(pmts[0].amount, pmts[1].amount)
10191019 else if ((size(pmts) == 1))
10201020 then if ((assetIdToStr(pmts[0].assetId) == AId))
10211021 then $Tuple2(pmts[0].amount, 0)
10221022 else if ((assetIdToStr(pmts[0].assetId) == BId))
10231023 then $Tuple2(0, pmts[0].amount)
10241024 else throw("Wrong payment")
10251025 else throw("One or two payments expected")
10261026
10271027
10281028 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
10291029 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
10301030 if ((0 > pri))
10311031 then (pri * -1)
10321032 else pri
10331033 }
10341034
10351035
10361036 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
10371037 let $t03254632805 = if (claim)
10381038 then claimFarmed(pType, pool)
10391039 else {
10401040 let claimedAsset = if ((pType == SF_POOL))
10411041 then SWOPID
10421042 else if ((pType == WX_POOL))
10431043 then WXID
10441044 else unknownPoolType()
10451045 $Tuple2(amount, claimedAsset)
10461046 }
10471047 let claimAmount = $t03254632805._1
10481048 let claimAsset = $t03254632805._2
10491049 let bal = accountBalance(claimAsset)
10501050 if (if ((amount > (claimAmount + change)))
10511051 then true
10521052 else (amount > bal))
10531053 then throw("To big amount to exchange")
10541054 else $Tuple2(claimAmount, claimAsset)
10551055 }
10561056
10571057
10581058 @Callable(i)
10591059 func getShareAssetPriceREADONLY (shareId) = {
10601060 let sharePrices = getSharePrice(shareId)
10611061 $Tuple2(nil, sharePrices)
10621062 }
10631063
10641064
10651065
10661066 @Callable(i)
10671067 func getUserPositionShareAmountREADONLY (user,posNum) = {
10681068 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
10691069 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
10701070 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
10711071 $Tuple2(nil, userCanWithdraw)
10721072 }
10731073
10741074
10751075
10761076 @Callable(i)
10771077 func getUserPositionREADONLY (user,pools,posNum) = {
10781078 func userPos (a,pool) = {
10791079 let $t03376733837 = a
10801080 let wAmountsA = $t03376733837._1
10811081 let wAmountsB = $t03376733837._2
10821082 let debts = $t03376733837._3
10831083 let eqWAmountsA = $t03376733837._4
10841084 let eqWAmountsB = $t03376733837._5
10851085 let index = $t03376733837._6
10861086 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
10871087 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
10881088 else {
10891089 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
10901090 let $t03411634206 = getPoolData(Address(fromBase58String(pool)), pType)
10911091 let AId = $t03411634206._1
10921092 let BId = $t03411634206._2
10931093 let balA = $t03411634206._3
10941094 let balB = $t03411634206._4
10951095 let shareId = $t03411634206._5
10961096 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
10971097 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
10981098 let $t03442234542 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
10991099 let wAmountA = $t03442234542._1
11001100 let wAmountB = $t03442234542._2
11011101 if ((borrowAmount > 0))
11021102 then {
11031103 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11041104 let debt = {
11051105 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
11061106 if ($isInstanceOf(@, "Int"))
11071107 then @
11081108 else throw(($getType(@) + " couldn't be cast to Int"))
11091109 }
11101110 if ((debt == debt))
11111111 then {
11121112 let amountToGetEx = if (if ((borrowAsset == AId))
11131113 then (debt > wAmountA)
11141114 else false)
11151115 then (debt - wAmountA)
11161116 else if (if ((borrowAsset == BId))
11171117 then (debt > wAmountB)
11181118 else false)
11191119 then (debt - wAmountB)
11201120 else 0
11211121 let amountToPay = if ((amountToGetEx > 0))
11221122 then if ((pType == SF_POOL))
11231123 then {
11241124 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
11251125 ex._2
11261126 }
11271127 else if ((pType == WX_POOL))
11281128 then {
11291129 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
11301130 ex._2
11311131 }
11321132 else unknownPoolType()
11331133 else 0
11341134 let $t03545435673 = if ((borrowAsset == AId))
11351135 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
11361136 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
11371137 let eqWAmountA = $t03545435673._1
11381138 let eqWAmountB = $t03545435673._2
11391139 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
11401140 }
11411141 else throw("Strict value is not equal to itself.")
11421142 }
11431143 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
11441144 }
11451145 }
11461146
11471147 let $t03592836039 = {
11481148 let $l = pools
11491149 let $s = size($l)
11501150 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
11511151 func $f0_1 ($a,$i) = if (($i >= $s))
11521152 then $a
11531153 else userPos($a, $l[$i])
11541154
11551155 func $f0_2 ($a,$i) = if (($i >= $s))
11561156 then $a
11571157 else throw("List size exceeds 20")
11581158
11591159 $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)
11601160 }
11611161 let wAmountsA = $t03592836039._1
11621162 let wAmountsB = $t03592836039._2
11631163 let debts = $t03592836039._3
11641164 let eqWAmountsA = $t03592836039._4
11651165 let eqWAmountsB = $t03592836039._5
11661166 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
11671167 }
11681168
11691169
11701170
11711171 @Callable(i)
11721172 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
11731173 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
11741174 if (!(isPoolActive(pool, pType)))
11751175 then throw("Pool not active at this moment")
11761176 else if (if ((100 > leverage))
11771177 then true
11781178 else (leverage > 300))
11791179 then throw("Leverage can't be <100 and >300")
11801180 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
11811181 then (leverage > 100)
11821182 else false)
11831183 then throw("You can't borrow in this pool")
11841184 else {
11851185 let $t03663736727 = getPoolData(Address(fromBase58String(pool)), pType)
11861186 let AId = $t03663736727._1
11871187 let BId = $t03663736727._2
11881188 let balA = $t03663736727._3
11891189 let balB = $t03663736727._4
11901190 let shareId = $t03663736727._5
11911191 if (if ((borrowId != AId))
11921192 then (borrowId != BId)
11931193 else false)
11941194 then throw("Wrong borrow asset")
11951195 else {
11961196 let $t03680836867 = parseReplenishPmts(i.payments, AId, BId)
11971197 let pmtA = $t03680836867._1
11981198 let pmtB = $t03680836867._2
11991199 let user = toString(i.caller)
12001200 let newPosNum = getNewUserPositionNumber(user)
12011201 if ((leverage > 100))
12021202 then {
12031203 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
12041204 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
12051205 let newRequestId = {
12061206 let @ = invoke(this, "createNewRequest", [request], nil)
12071207 if ($isInstanceOf(@, "Int"))
12081208 then @
12091209 else throw(($getType(@) + " couldn't be cast to Int"))
12101210 }
12111211 if ((newRequestId == newRequestId))
12121212 then {
12131213 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
12141214 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
12151215 if ((inv == inv))
12161216 then {
12171217 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
12181218 let $t03785637950 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
12191219 if (($t03785637950 == $t03785637950))
12201220 then {
12211221 let newBalB = $t03785637950._2
12221222 let newBalA = $t03785637950._1
12231223 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
12241224 let $t03802038135 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
12251225 let wAmountA = $t03802038135._1
12261226 let wAmountB = $t03802038135._2
12271227 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
12281228 }
12291229 else throw("Strict value is not equal to itself.")
12301230 }
12311231 else throw("Strict value is not equal to itself.")
12321232 }
12331233 else throw("Strict value is not equal to itself.")
12341234 }
12351235 else {
12361236 let $t03818838303 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
12371237 if (($t03818838303 == $t03818838303))
12381238 then {
12391239 let axlyFee = $t03818838303._2
12401240 let userStaked = $t03818838303._1
12411241 let $t03830938403 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
12421242 if (($t03830938403 == $t03830938403))
12431243 then {
12441244 let newBalB = $t03830938403._2
12451245 let newBalA = $t03830938403._1
12461246 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
12471247 let $t03847338588 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
12481248 let wAmountA = $t03847338588._1
12491249 let wAmountB = $t03847338588._2
12501250 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
12511251 }
12521252 else throw("Strict value is not equal to itself.")
12531253 }
12541254 else throw("Strict value is not equal to itself.")
12551255 }
12561256 }
12571257 }
12581258 })
12591259
12601260
12611261
12621262 @Callable(i)
12631263 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
12641264 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
12651265 if (!(isPoolActive(pool, pType)))
12661266 then throw("Pool not active at this moment")
12671267 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
12681268 })
12691269
12701270
12711271
12721272 @Callable(i)
12731273 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
12741274 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
12751275 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
12761276 if (!(isPoolActive(poolId, pType)))
12771277 then throw("Pool not active at this moment")
12781278 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
12791279 then throw("There are no user position")
12801280 else if ((0 >= price))
12811281 then throw("Price must be greater than 0")
12821282 else if ((price > tokenOraclePrice))
12831283 then throw("Price must be less than current token price")
12841284 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
12851285 })
12861286
12871287
12881288
12891289 @Callable(i)
12901290 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
12911291 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
12921292 if (!(isPoolActive(poolId, pType)))
12931293 then throw("Pool not active at this moment")
12941294 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
12951295 then throw("No entry")
12961296 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
12971297 })
12981298
12991299
13001300
13011301 @Callable(i)
13021302 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
13031303 then throw("Already inited")
13041304 else if (!(isDefined(addressFromString(moneyBoxAddr))))
13051305 then throw("moneyBoxAddr is not correct address")
13061306 else if (!(isDefined(addressFromString(sfFarmingAddr))))
13071307 then throw("sfFarmingAddr is not correct address")
13081308 else if (!(isDefined(addressFromString(lendAddr))))
13091309 then throw("lendAddr is not correct address")
13101310 else if (!(isDefined(addressFromString(priceOracleAddr))))
13111311 then throw("priceOracleAddr is not correct address")
13121312 else if (!(isDefined(addressFromString(keeperExContract))))
13131313 then throw("keeperExContract is not correct address")
13141314 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
13151315 then throw("swopAssetId is not correct asset id")
13161316 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
13171317 then throw("swopAssetId is not correct asset id")
13181318 else if ((size(fromBase58String(operatorPubKey)) != 32))
13191319 then throw("operatorPubKey is not correct")
13201320 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
13211321 then throw("group1Admin1PubKey is not correct")
13221322 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
13231323 then throw("group1Admin2PubKey is not correct")
13241324 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
13251325 then throw("group2Admin1PubKey is not correct")
13261326 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
13271327 then throw("group2Admin2PubKey is not correct")
13281328 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)])
13291329
13301330
13311331
13321332 @Callable(i)
13331333 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
13341334 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
13351335 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
13361336 })
13371337
13381338
13391339
13401340 @Callable(i)
13411341 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
13421342 let $t04342743531 = parseRequest(requestId)
13431343 let user = $t04342743531._1
13441344 let pool = $t04342743531._2
13451345 let pmtA = $t04342743531._3
13461346 let AId = $t04342743531._4
13471347 let pmtB = $t04342743531._5
13481348 let BId = $t04342743531._6
13491349 let balA = $t04342743531._7
13501350 let balB = $t04342743531._8
13511351 let shareId = $t04342743531._9
13521352 let bwAsset = $t04342743531._10
13531353 let bwAmount = $t04342743531._11
13541354 if ((size(i.payments) != 1))
13551355 then throw("Wrong payment size")
13561356 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
13571357 then true
13581358 else (i.payments[0].amount != bwAmount))
13591359 then throw("Wrong payment")
13601360 else {
13611361 let $t04372143821 = if ((AId == bwAsset))
13621362 then $Tuple2((pmtA + bwAmount), pmtB)
13631363 else $Tuple2(pmtA, (pmtB + bwAmount))
13641364 let pmtAllA = $t04372143821._1
13651365 let pmtAllB = $t04372143821._2
13661366 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
13671367 let $t04390344018 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
13681368 let userStaked = $t04390344018._1
13691369 let axlyFee = $t04390344018._2
13701370 let posNum = getNewUserPositionNumber(user)
13711371 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
13721372 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
13731373 let $t04437844493 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
13741374 let wAmountA = $t04437844493._1
13751375 let wAmountB = $t04437844493._2
13761376 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
13771377 }
13781378 }))
13791379
13801380
13811381
13821382 @Callable(i)
13831383 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
13841384 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13851385 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13861386 let $t04501445104 = getPoolData(Address(fromBase58String(pool)), pType)
13871387 let AId = $t04501445104._1
13881388 let BId = $t04501445104._2
13891389 let balA = $t04501445104._3
13901390 let balB = $t04501445104._4
13911391 let shareId = $t04501445104._5
13921392 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
13931393 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
13941394 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13951395 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
13961396 if ((liquidateAmount > userCanWithdraw))
13971397 then throw("You can't liquidate more than user have")
13981398 else if ((borrowAmount == 0))
13991399 then throw("You can't liquidate position without borrow")
14001400 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))]
14011401 }))
14021402
14031403
14041404
14051405 @Callable(i)
14061406 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14071407 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14081408 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
14091409 if ((tokenOraclePrice > stopLossPrice))
14101410 then throw("Token price greater stop loss price")
14111411 else {
14121412 let res = withdrawToUser(user, pool, toString(posId), true)
14131413 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
14141414 }
14151415 }))
14161416
14171417
14181418
14191419 @Callable(i)
14201420 func capitalizeExKeeper (pool,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14211421 let pType = getStringValue(this, (kPool + pool))
14221422 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
14231423 let $t04725647355 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
14241424 let claimedAmount = $t04725647355._1
14251425 let claimedAsset = $t04725647355._2
14261426 let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
14271427 let newChange = ((claimedAmount + change) - amountToExchange)
14281428 let changeEntry = if ((newChange >= 0))
14291429 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14301430 else throw("Negative change")
14311431 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14321432 }))
14331433
14341434
14351435
14361436 @Callable(i)
14371437 func capitalizeExPuzzle (pool,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14381438 let pType = getStringValue(this, (kPool + pool))
14391439 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
14401440 let $t04815548254 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
14411441 let claimedAmount = $t04815548254._1
14421442 let claimedAsset = $t04815548254._2
14431443 let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
14441444 let newChange = ((claimedAmount + change) - amountToExchange)
14451445 let changeEntry = if ((newChange >= 0))
14461446 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14471447 else nil
14481448 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14491449 }))
14501450
14511451
14521452
14531453 @Callable(i)
14541454 func capitalizeExSwopFi (pool,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14551455 let pType = getStringValue(this, (kPool + pool))
14561456 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
14571457 let $t04909949198 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
14581458 let claimedAmount = $t04909949198._1
14591459 let claimedAsset = $t04909949198._2
14601460 let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
14611461 let newChange = ((claimedAmount + change) - amountToExchange)
14621462 let changeEntry = if ((newChange >= 0))
14631463 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14641464 else nil
14651465 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14661466 }))
14671467
14681468
14691469
14701470 @Callable(i)
14711471 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14721472 let pType = getStringValue(this, (kPool + pool))
14731473 let $t04979549890 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
14741474 let claimedAmount = $t04979549890._1
14751475 let claimedAsset = $t04979549890._2
14761476 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
14771477 }))
14781478
14791479
14801480
14811481 @Callable(i)
14821482 func initNewPool (type,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
14831483 then (type != WX_POOL)
14841484 else false)
14851485 then throw("Wrong type")
14861486 else {
14871487 let $t05031650410 = getPoolData(Address(fromBase58String(poolAddr)), type)
14881488 let aId = $t05031650410._1
14891489 let bId = $t05031650410._2
14901490 let aBal = $t05031650410._3
14911491 let bBal = $t05031650410._4
14921492 let shareId = $t05031650410._5
14931493 if ((0 > inFeeNoLoan))
14941494 then throw("inFeeNoLoan must be greater than 0")
14951495 else if ((0 > inFeeLoan))
14961496 then throw("inFeeLoan must be greater than 0")
14971497 else if ((0 > capFeeNoLoan))
14981498 then throw("capFeeNoLoan must be greater than 0")
14991499 else if ((0 > capFeeWithLoan))
15001500 then throw("capFeeWithLoan must be greater than 0")
15011501 else if ((0 > stoplossFeeNoLoan))
15021502 then throw("stoplossFeeNoLoan must be greater than 0")
15031503 else if ((0 > stoplossFeeWithLoan))
15041504 then throw("stoplossFeeWithLoan must be greater than 0")
15051505 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)]
15061506 }))
15071507
15081508
15091509
15101510 @Callable(i)
15111511 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
15121512 then throw("dApp already active")
15131513 else [BooleanEntry(kActive, true)])
15141514
15151515
15161516
15171517 @Callable(i)
15181518 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
15191519 then throw("dApp already shutdown")
15201520 else [BooleanEntry(kActive, false)])
15211521
15221522
15231523
15241524 @Callable(i)
15251525 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
15261526 then throw("dApp already active for users")
15271527 else [BooleanEntry(kActiveUsers, true)])
15281528
15291529
15301530
15311531 @Callable(i)
15321532 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
15331533 then throw("dApp already shutdown for users")
15341534 else [BooleanEntry(kActiveUsers, false)])
15351535
15361536
15371537
15381538 @Callable(i)
15391539 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
15401540 then throw("SWOPFI already active")
15411541 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
15421542
15431543
15441544
15451545 @Callable(i)
15461546 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
15471547 then throw("SWOPFI already shutdown")
15481548 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
15491549
15501550
15511551
15521552 @Callable(i)
15531553 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
15541554 then throw("WX already active")
15551555 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
15561556
15571557
15581558
15591559 @Callable(i)
15601560 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
15611561 then throw("WX already shutdown")
15621562 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
15631563
15641564
15651565
15661566 @Callable(i)
15671567 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
15681568 then throw("Unknown pool")
15691569 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
15701570 then throw("Pool already active")
15711571 else [BooleanEntry((pool + kPoolActive), true)])
15721572
15731573
15741574
15751575 @Callable(i)
15761576 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
15771577 then throw("Unknown pool")
15781578 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
15791579 then throw("Pool already shutdown")
15801580 else [BooleanEntry((pool + kPoolActive), false)])
15811581
15821582
15831583 @Verifier(tx)
15841584 func verify () = match tx {
15851585 case inv: InvokeScriptTransaction =>
15861586 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
15871587 let isRightFee = if ((inv.fee == 900000))
15881588 then (inv.feeAssetId == unit)
15891589 else false
15901590 let isInitCall = (inv.function == "init")
15911591 let isnoPayments = (size(inv.payments) == 0)
15921592 if (if (if (isRightFee)
15931593 then isInitCall
15941594 else false)
15951595 then isSelf
15961596 else false)
15971597 then isnoPayments
15981598 else false
15991599 case _ =>
16001600 let group1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
16011601 then 1
16021602 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin2PK))
16031603 then 1
16041604 else 0))
16051605 let group2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin1PK))
16061606 then 1
16071607 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin2PK))
16081608 then 1
16091609 else 0))
16101610 ((group1Signed + group2Signed) == 2)
16111611 }
16121612

github/deemru/w8io/3ef1775 
168.59 ms